2014-12-22 59 views
0

我在画布上有2个位图。打开顶部位图时,较低的位图应该可见并且顶部位图应该被擦除。 我从这个线程获得了帮助。 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 temp = BitmapFactory.decodeResource(getResources(), R.drawable.aa); 
bm1 = temp.copy(Bitmap.Config.ARGB_8888, true); // mutable = true 

要小心在这里内存不足的错误。

其次,在你的onDraw功能,通过写回BM1更新位图的内容:

@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