Так что я боролся с этим большую часть дня. Предположим, у меня есть собственный ImageView, который я хочу наложить на фоновый вид (оба в RelativeLayout), который при прикосновении стирает части исходного растрового изображения представления, как инструмент стирания в MS Paint, открывая вид под ним. Я проверил практически все потоки (например, этот), и они предлагают использовать режим PorterDuff SRC в объекте 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);
}
}
addView
, чтобы добавить изображение, которое позже будет удалено, а затем вызватьremoveView
при касании. Я предполагаю, что это может работать или не работать в зависимости от того, что вы на самом деле хотите, чтобы ваше приложение делало. И я не вижу никаких ошибок в вашем коде, но я предполагаю, что есть какая-то глупость, которая разрушает всю операцию. Обычно мои необъяснимые ошибки происходят из-за моей невнимательности. Я могу ошибаться, но это может быть что-то очень простое. - person Reed   schedule 22.11.2011