Предположим, что у меня есть 500 x 500 ImageView, половина ImageView - красная вторая часть прозрачная. Я хочу рисовать пальцем только в непрозрачной части ImageVIew, поэтому, если я рисую прозрачную часть, она не будет видна, как это изображение. Возможно ли это? Как нарисовать пальцем в виде без рисунка в прозрачных частях?
Я пробовал, но этот код не работает.
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;
}
}
Я думаю, что лучше всего сделать часть, которая имеет чертеж, будет его собственным видом, поэтому его 'onTouchEvent' будет проще. Вы можете иметь «ViewGroup», как «LinearLayout», у которого есть один вид с прозрачной частью, а другой - с частью чертежа. –
kris larson Я не могу этого сделать, потому что это могут быть пользовательские изображения в Image (например, enimals). В этом случае я просто поставил простой образ. –