У меня есть ImageView
, который содержит два растровых изображения фона и рисунка, нарисованного на переднем плане. То, что я хочу сделать, это удалить шаблон, нарисованный на переднем плане, чтобы весь фон был обнаружен на стертых деталях. Исчерпывающая часть, которую я выяснил, и это работает.Удалить текстуру на оверлейном растровом изображении - Android
Моя проблема в том, что при стирании позиции касания неточно. Это связано с тем, что размер Bitmap
на холсте переднего плана не совпадает с размером холста ImageView
. Я изменяю размер моего ImageView
в методе onMeasure
, чтобы соответствовать экрану, не уменьшая его.
Как решить эту проблему? Я думал об использовании двух видов изображений, по одному для каждого растрового изображения, но этот процесс утомителен, а также вызывает проблемы с производительностью. Я хотел бы использовать один ImageView
и два растровых изображения.
Вот мой код, чтобы объяснить мою проблему немного больше.
final Paint pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
pTouch.setColor(Color.TRANSPARENT);
pTouch.setMaskFilter(new BlurMaskFilter(10, Blur.NORMAL));
final Canvas c2 = new Canvas(_currentTextureBitmap);
ImageView iv = new ImageView(this) {
int x = 0;
int y = 0;
int _width;
int _height;
@Override
public boolean onTouchEvent(MotionEvent ev) {
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;
}
}
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
Drawable d = getDrawable();
if(d!=null){
// ceil not round - avoid thin vertical gaps along the left/right edges
_width = MeasureSpec.getSize(widthMeasureSpec);
_height = (int) Math.ceil((float) _width * (float) d.getIntrinsicHeight()/(float) d.getIntrinsicWidth());
setMeasuredDimension(_width, _height);
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
if (_selectedImageURI != null)
if (_erase) {
//draw background
canvas.drawBitmap(_backgroundBitmap, null, new RectF(0, 0, _width, _height), null);
if (_currentTextureBitmap != null) {
c2.drawCircle(x, y, 40, pTouch);
canvas.drawBitmap(_currentTextureBitmap, null, new RectF(0, 0, _width, _height), null);
}
}
}
};