2014-12-22 56 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