2016-05-20 5 views
0

Предположим, что у меня есть 500 x 500 ImageView, половина ImageView - красная вторая часть прозрачная. Я хочу рисовать пальцем только в непрозрачной части ImageVIew, поэтому, если я рисую прозрачную часть, она не будет видна, как это изображение. Возможно ли это? enter image description hereКак нарисовать пальцем в виде без рисунка в прозрачных частях?

Я пробовал, но этот код не работает.

public class DrawingView extends ImageView { 

     private boolean isTransparent; 
     private float mX, mY; 
     private static final float TOUCH_TOLERANCE = 4; 
     private Bitmap mBitmap; 
     private Canvas mCanvas; 
     private Path mPath; 
     private Paint mBitmapPaint; 
     Context mContext; 
     private Path circlePath; 

     public DrawingView(Context c) { 
      super(c); 
      mContext = c; 
      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
      circlePath = new Path(); 
     } 

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

     @Override 
     protected void onDraw(Canvas canvas) { 
      super.onDraw(canvas); 
      if (mBitmap != null && canvas != null && !isTransparent) { 
       canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
       canvas.drawPath(mPath, mPaint); 
      } 
     } 

     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) { 
       if(mBitmap.getPixel((int)x, (int)y) == Color.TRANSPARENT || mBitmap.getPixel((int)mY, (int)mY) == Color.TRANSPARENT) { 
        isTransparent = true; 
       } else { 
        isTransparent = false; 
       } 

       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 

       circlePath.reset(); 
       circlePath.addCircle(mX, mY, 30, Path.Direction.CW); 
      } 
     } 

     private void touch_up() { 
      mPath.lineTo(mX, mY); 
      circlePath.reset(); 
      mCanvas.drawPath(mPath, mPaint); 
      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

Я думаю, что лучше всего сделать часть, которая имеет чертеж, будет его собственным видом, поэтому его 'onTouchEvent' будет проще. Вы можете иметь «ViewGroup», как «LinearLayout», у которого есть один вид с прозрачной частью, а другой - с частью чертежа. –

+0

kris larson Я не могу этого сделать, потому что это могут быть пользовательские изображения в Image (например, enimals). В этом случае я просто поставил простой образ. –

ответ

1

Я не знаю, где mPaint инициализируется, но так как mPaint используется для рисования пальцем след, поставив эту строку в должны делать то, что вы хотите:

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)); 

См this image пояснения.

+0

Большое спасибо, это то, что я ищу! :) –

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