Так что я боролся с этим большую часть дня.Предположим, у меня есть пользовательский ImageView, который я хочу наложить на фоновое представление (оба в пределах RelativeLayout), которое при касании стирает части исходного растрового изображения представления, подобно инструменту стирания в MS Paint, открывая представление под ним.Я проверил почти все потоки (например, этот ), и они предлагают использовать PorterDuff SRC Mode в объекте Paint, а также создать Canvas из теневой копии ARGB_8888 исходной растровой карты дляприменить маскировку.
Кроме того, я не могу заранее установить источник наложения, поскольку мне необходимо загрузить его по сети, чтобы тип масштабирования ImageView позаботился о масштабировании для меня.
Каждый раз, когда я переопределяю onDraw, когда я применяю стирание к растровому изображению IV, он отображает черный фон вместо вида под ним, даже если я установил прозрачный фон.Так что я в своей последней веревке относительно того, что нужно сделать, чтобы раскрыть фоновое представление.
Вот что у меня есть до сих пор:
конструктор представления:
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setColor(Color.TRANSPARENT);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(STROKE_WIDTH);
paint.setAntiAlias(true);
переопределил setImageBitmap для установки моего холста из моего переконфигурированного исходного растрового изображения:
public void setImageBitmap(Bitmap bitmap){
super.setImageBitmap(bitmap);
Drawable bd = getDrawable();
if(bd == null){
return;
}
Bitmap fullSizeBitmap = ((BitmapDrawable) bd).getBitmap();
overlay = fullSizeBitmap.copy(Config.ARGB_8888, true);
c2 = new Canvas(overlay);
}
метод onDraw:
protected void onDraw(Canvas canvas) {
/*
* Override paint call by re-drawing the view's Bitmap first, then overlaying our path on top of it
*/
Drawable bd = getDrawable();
if(bd == null){
return;
}
Bitmap fullSizeBitmap = ((BitmapDrawable) bd).getBitmap();
if(fullSizeBitmap != null && c2 != null){
canvas.drawColor(Color.TRANSPARENT);
c2.drawBitmap(fullSizeBitmap, 0, 0, null);
c2.drawPath(path, paint);
canvas.drawBitmap(overlay, 0, 0, null);
}
}