2012-01-17 13 views
10

मुझे स्कूल में अपनी अंतिम परियोजना के लिए "स्क्रैच कार्ड" ऐप बनाने की आवश्यकता है और स्क्रैचिंग ईवेंट को कार्यान्वित करने का तरीका नहीं मिल सकता है (मैं पृष्ठभूमि छवि कैसे बना सकता हूं और उस पर ग्रे आयत डाल सकता हूं, इसलिए जब मैं खरोंच करूँगा उन आयतों में मैं उनके नीचे की तस्वीर देखूंगा)एंड्रॉइड में स्क्रैच कार्ड कैसे बनाएं?

कार्यान्वयन एंड्रॉइड में होना चाहिए क्योंकि मैं अभी तक उद्देश्य-सी में विकसित नहीं करना चाहता हूं।

मैंने उद्देश्य-सी कार्यान्वयन के लिए एक संदर्भ देखा, लेकिन यह अच्छा नहीं है क्योंकि मुझे यह समझ में नहीं आता है।

मेरे कोड है:

public class FingerPaint extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     try { 
      MyView myView = new MyView(this); 
      myView.requestFocus(); 
      myView.PaintObjectInit(); 
      // setContentView(myView); 

      LinearLayout upper = (LinearLayout) findViewById(R.id.LinearLayout01); 
      upper.addView(myView); 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 

     // MyImageView myImageView = new MyImageView(this); 
     // setContentView(myImageView); 
    } 
} 



public class MyView extends View { 

    private Paint mPaint; 
    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 

    public MyView(Context context) { 
     super(context); 
     this.mPaint = new Paint(); 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    protected void PaintObjectInit() { 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     //mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
     //mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 

     try 
     { 


     //Bitmap bm1 = BitmapFactory.decodeResource(this.getResources(),R.drawable.scratch).copy(Bitmap.Config.ARGB_8888, true);; 
     //Bitmap bm2 = BitmapFactory.decodeResource(this.getResources(),R.drawable.main).copy(Bitmap.Config.ARGB_8888, true);; 

     //mBitmap = toTransparency(bm1, 0xFFAAAAAA, true, bm2); 

     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     canvas.drawColor(0xFFAAAAAA); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     // mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 

    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     // mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
     } 
     return true; 
    } 
} 

इस बारे में मदद करें।

+0

जांच इस सवाल http://stackoverflow.com/questions/5848722/android-scratch-card-app – Sameer

+0

यह मेरी मदद dosen't, मैं इसे बहुत अच्छी तरह से समझ में नहीं आता है। – Offer

+0

तो स्क्रैच कार्ड इतना आसान नहीं है। एंड्रॉइड में एनएफसी के बारे में पढ़ें। यह मदद करेगा। – Sameer

उत्तर

10

मैं हाल ही में इस समस्या का सामना करना है और फिर मैं इस के लिए एक पुस्तकालय बनाया ताकि हर कोई खरोंच देखने के एक त्वरित कार्यान्वयन हो सकता है, मैं इस पुस्तकालय बहुत पाया उम्मीद है कि इस जो अभी भी इस सवाल का जवाब https://github.com/winsontan520/Android-WScratchView

+0

क्या मैं छवि का उपयोग कर सकता हूं ओवरले के रूप में ?? –

1

की तलाश में लोगों की मदद कर सकते हैं उपयोगी।

https://github.com/sharish/ScratchView

बहुत आसान एकीकृत करने के लिए

<com.cooltechworks.views.ScratchImageView 
    android:id="@+id/sample_image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:src="@drawable/img_sample2" 
/> 

enter image description hereenter image description here

1

आप इस तरह की तरह "स्क्रैच कार्ड" आवेदन कर सकते हैं। आपको नीचे दिए गए कोड का पालन करना होगा जो काम कोड है। आपको बस अपने तर्क को समझने और कार्यान्वित करने की आवश्यकता है।

public class MainActJava extends AppCompatActivity { 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); 
     setContentView(new MyView(this, bitmap)); 
    } 

    public class MyView extends View implements View.OnTouchListener { 

     private static final float TOUCH_TOLERANCE = 4; 
     private Paint mPaint; 
     private Bitmap oBitmap; 
     private Bitmap holder; 
     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mBitmapPaint; 
     private float mX, mY; 

     public MyView(Context context) { 
      super(context); 
     } 

     public MyView(Context context, Bitmap bitmap) { 
      super(context); 
      setOnTouchListener(this); 
      this.oBitmap = bitmap; 
      this.mPaint = new Paint(); 
      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
      init(); 
     } 

     protected void init() { 
      mPaint.setAntiAlias(true); 
      mPaint.setDither(true); 
      mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      mPaint.setStyle(Paint.Style.STROKE); 
      mPaint.setStrokeJoin(Paint.Join.ROUND); 
      mPaint.setStrokeCap(Paint.Cap.ROUND); 
      mPaint.setStrokeWidth(35); 
     } 

     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      super.onSizeChanged(w, h, oldw, oldh); 
      holder = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
      mCanvas = new Canvas(holder); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      onDrawing(canvas); 
     } 

     private void onDrawing(Canvas canvas) { 
      mCanvas.drawColor(0xFFAAAAAA); 
      mCanvas.drawPath(mPath, mPaint); 
      canvas.drawBitmap(oBitmap, getWidth()/2, getHeight()/2, mBitmapPaint); 
      canvas.drawBitmap(holder, 0, 0, mBitmapPaint); 
     } 

     private void touch_start(float x, float y) { 
      mPath.moveTo(x, y); 
      mX = x; 
      mY = y; 
     } 

     private void touch_move(float x, float y) { 
      float dx = Math.abs(x - mX); 
      float dy = Math.abs(y - mY); 
      if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 
      } 
     } 

     private void touch_up() { 
      mPath.lineTo(mX, mY); 
      mCanvas.drawPath(mPath, mPaint); 
     } 


     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      float x = event.getX(); 
      float y = event.getY(); 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        touch_start(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        touch_move(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_UP: 
        touch_up(); 
        invalidate(); 
        break; 
      } 
      return true; 
     } 
    } 
} 

आउटपुट:

enter image description here

संबंधित मुद्दे