java - Android 图形 - 拖动位图时清除 Canvas

标签 java android android-bitmap

我在 Canvas 上有一个位图(backgroundBitmap),我希望保持不变,还有另一个较小的位图(draggableBitmap),我希望用户能够将其拖动到backgroundBitmap上方。 (我的意思是 z 轴上的“上方”)。

我的想法是,我只是在每次 ACTION_MOVE 时重新绘制背景。当我使用纯色执行此操作时,效果非常好。当我重绘backgroundBitmap而不是颜色时,backgroundBitmap仍然可见,但draggableBitmap只是沿着拖动的路径重复自身。为什么纯色可以“清晰”图像,而位图却不能?

编辑: 非常感谢 Steve K 提供的帮助。我更新了下面的代码以反射(reflect)迄今为止的进展。此时唯一的问题是开始拖动后图像会完全变黑。这是否与背景位图设置为可变有关?如果没有它,我会遇到可变性错误。

package com.example.drawing;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawingView extends View {
    // drawing and canvas paint
    private Paint canvasPaint;
    // canvas
    private Canvas drawCanvas;
    // canvas bitmap
    private Bitmap backgroundBitmap, draggableBitmap;

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
    }

    private void setupDrawing() {
        canvasPaint = new Paint();
        canvasPaint.setColor(Color.TRANSPARENT);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        BitmapFactory.Options opt1 = new BitmapFactory.Options();
        opt1.inMutable = true;
        opt1.inSampleSize = 4;

        BitmapFactory.Options opt2 = new BitmapFactory.Options();
        opt2.inMutable = true;

        backgroundBitmap = BitmapFactory.decodeFile("/storage/emulated/0/DCIM/Camera/20140901_223343.jpg", opt1);

        draggableBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.draggable_image, opt2);

        drawCanvas = new Canvas(backgroundBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(backgroundBitmap, 0, 0, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // Nothing here
                break;
            case MotionEvent.ACTION_MOVE:
                drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null);
                drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null);
                break;
            case MotionEvent.ACTION_UP:
                // Nothing here
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }
}

最佳答案

颜色没有定义的边界,因此它通过写入每个像素来“清除” Canvas 。您的 float 位图不会 - 它只会在其所在的位置重绘。整个 Canvas 需要重新绘制,首先用颜色清除,然后绘制。

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Nothing here
            break;
        case MotionEvent.ACTION_MOVE:
            drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
            drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null);
            drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null);
            break;
        case MotionEvent.ACTION_UP:
            // Nothing here
            break;
        default:
            return false;
    }

    invalidate();
    return true;
}

关于java - Android 图形 - 拖动位图时清除 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635158/

相关文章:

java - 在单个java对象中反序列化json的父子节点数据

android - 使用 Eclipse 测试 PhoneGap 应用程序时不断收到 "A network error occurred"

android - 图像反转时添加进度条

java - Android/Java/Kotlin : Merge 2 Bitmaps in one Canvas

android - 在没有 Apache HTTP 客户端的情况下从流中解码位图

java - income_amount (code 1) : , 编译时:SELECT SUM(income_amount) FROM INCOME WHERE month = '24'

java - 如何获取 Feign 客户端的名称?

java - 变量在方法中定义了 2 次

android - 使 NumberPicker 字符串值可重复

java - BOX2D - 与 Monster 的正确碰撞