Я пытаюсь стереть части битового массива в моем приложении Android при помощи Вареного пудинга Носильщика Xfermodes.
У меня есть зеленый фон, который является overlayed синим битовым массивом. Когда я касаюсь экрана, "дыра" в накладывающем битовом массиве, как предполагается, создается, делая зеленый фон видимым. Вместо дыры мой текущий код производит черную точку.
Ниже мой код. Какие-либо идеи, что я делаю неправильно здесь?
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new DrawView(this));
}
public class DrawView extends View implements OnTouchListener {
private int x = 0;
private int y = 0;
Bitmap bitmap;
Canvas bitmapCanvas;
private final Paint paint = new Paint();
private final Paint eraserPaint = new Paint();
public DrawView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
// Set background
this.setBackgroundColor(Color.GREEN);
// Set bitmap
bitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.RGB_565);
bitmapCanvas = new Canvas();
bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.drawColor(Color.BLUE);
// Set eraser paint properties
eraserPaint.setAlpha(0);
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
eraserPaint.setAntiAlias(true);
}
@Override
public void onDraw(Canvas canvas) {
bitmapCanvas.drawColor(Color.BLUE);
bitmapCanvas.drawCircle(x, y, 10, eraserPaint);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
public boolean onTouch(View view, MotionEvent event) {
x = (int) event.getX();
y = (int) event.getY();
invalidate();
return true;
}
}
Сначала подумал, я не уверен, что установка альфа на 0 для объекта стирания краски - хорошая идея. Это может сделать все неэффективным.
Кроме того, вы всегда должны использовать Bitmap.Config.ARGB_8888, если вы имеете дело с альфа-версиями.
Если у вас возникли проблемы с PorterDuff, я бы посоветовал упростить ваш подход, сделав ТОЛЬКО это (временно). Это поможет вам сузить круг вопросов, которые не работают. Комментируйте все, что связано с сенсорным экраном, и просматривайте обновления.
Затем вы можете выделить, какая часть рисунка работает неправильно. Настройте свой конструктор следующим образом:
DrawView()
{
/* Create the background green bitmap */
...
/* Create foreground transparent bitmap */
...
/* Draw a blue circle on the foreground bitmap */
...
/* Apply the foreground to the background bitmap
using a PorterDuff method */
...
}
onDraw()
{
/* Simply draw the background bitmap */
...
}
Если вы настроите такие вещи, вы сможете определить, как ваш метод PD влияет на зеленое растровое изображение, и соответствующим образом изменить положение.