title: How to create a Scratch Card in Android?
body: <p>I need to create a "Scratch Card" App for my final project in school and can't find the way how to implement the scratching event (How do I create background image and put Grey rectangles over it, so when I will scratch those rectangles I will see the picture under them)</p>
  
  <p>The Implementation must be in Android because I don't how to develop In Objective-C yet.</p>
  
  <p>I saw a reference for Objective-C Implementation, but it's no good as I don't understand it.</p>
  
  <p>My Code is:</p>
  
  <pre><code>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 &gt;= TOUCH_TOLERANCE || dy &gt;= 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;
      }
  }
  </code></pre>
  
  <p>Please help regarding this.</p>