2014-12-22 1 views
0

У меня есть 2 растровых изображения на холсте. ontouching top bitmap, нижняя растровая карта должна быть видимой, а верхняя растровая карта должна быть удалена. Я воспользовался этой темой. Make certain area of bitmap transparent on touch. Я вижу нижнюю растровую карту по кругу, но верхняя растровая карта не стирается при касании. Как стереть растровое изображение при касании. Я знаю, что этот вопрос задавали раньше, но я не могу решить проблему.Выполнение касания области растрового изображения до прозрачного

это мой код:

public class MainActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(new Panel(this)); 
} 

class Panel extends View { 
    Bitmap bmOverlay; 
    private Paint mPaint; 
    Bitmap bm2, bm1; 
    Bitmap bitmap; 
    Canvas pcanvas; 

    int x = 0; 
    int y = 0; 
    int r = 0; 

    public Panel(Context context) { 
     super(context); 
     setFocusable(true); 
     setBackgroundColor(Color.TRANSPARENT); 

     // setting paint 
     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     mPaint.setColor(Color.TRANSPARENT); 
     mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); 
     mPaint.setAntiAlias(true); 

     bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.aa); 
     bm2 = BitmapFactory.decodeResource(getResources(), R.drawable.aaa); 

     bmOverlay = Bitmap.createBitmap(bm1.getWidth(), bm1.getHeight(), 
       Bitmap.Config.ARGB_8888); 
     pcanvas = new Canvas(bmOverlay); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // draw a circle that is erasing bitmap 
     super.onDraw(canvas); 
     canvas.drawBitmap(bm2, 0, 0, null); 
     pcanvas.drawBitmap(bm1, 0, 0, null); 
     pcanvas.drawCircle(x, y, 40, mPaint); 
     canvas.drawBitmap(bmOverlay, 0, 0, null); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     // set parameter to draw circle on touch event 

     switch (ev.getAction()) { 

     case MotionEvent.ACTION_DOWN: { 

      x = (int) ev.getX(); 
      y = (int) ev.getY(); 
      invalidate(); 

      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 

      x = (int) ev.getX(); 
      y = (int) ev.getY(); 
      invalidate(); 
      break; 

     } 

     case MotionEvent.ACTION_UP: 

      break; 

     } 
     return true; 
    } 



} 
} 

ответ

1

Вам необходимо внести два изменения, чтобы получить верхнюю растровый стереть. Во-первых, сделать это изменяемый Bitmap, так что вы можете изменить содержимое, как стирается:

Bitmap temp = BitmapFactory.decodeResource(getResources(), R.drawable.aa); 
bm1 = temp.copy(Bitmap.Config.ARGB_8888, true); // mutable = true 

Будьте осторожны из ошибок памяти здесь.

Во-вторых, в функции OnDraw, обновить содержимое растровой написав обратно ВМ1:

@Override 
protected void onDraw(Canvas canvas) { 
    // draw a circle that is erasing bitmap 
    super.onDraw(canvas); 
    canvas.drawBitmap(bm2, 0, 0, null); 
    pcanvas.drawBitmap(bm1, 0, 0, null); 
    pcanvas.drawCircle(x, y, 40, mPaint); 
    canvas.drawBitmap(bmOverlay, 0, 0, null); 

    // erase the top bitmap: 
    Canvas bitmapCanvas = new Canvas(bm1); 
    bitmapCanvas.drawBitmap(bm2, 0, 0, null); 
    bitmapCanvas.drawBitmap(bmOverlay, 0, 0, null); 
} 

Кроме того, чтобы остановить круг стирается в левом верхнем углу, когда вы запускаете приложение, создать логическое со значением по умолчанию false и установить его внутри onTouchEvent, когда у вас есть действительные координаты, и проверьте его перед вызовом drawCircle.

+0

Это сработало! спасибо тонне! – Madhav

+0

, когда я сохраняю bmoverlay, сохраненное изображение имеет черную точку в позиции, где она была затронута последней. Как я могу удалить эту черную точку из сохраненного изображения ???? – Madhav

+0

Пытаетесь сохранить скриншот? Попробуйте сохранить bm1 вместо bmOverlay. – samgak

 Смежные вопросы

  • Нет связанных вопросов^_^