Растровые части стирания с помощью режима PorterDuff

Я пытаюсь стереть части битового массива в моем приложении 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;
    }

}
14
задан Philipp 12 August 2010 в 11:57
поделиться

1 ответ

Сначала подумал, я не уверен, что установка альфа на 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 влияет на зеленое растровое изображение, и соответствующим образом изменить положение.

6
ответ дан 1 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: