【问题标题】:Making touched area of bitmap to transparent使位图的触摸区域透明
【发布时间】:2014-12-22 06:55:50
【问题描述】:

我在画布上有 2 个位图。在触摸顶部位图时,低位图应该是可见的并且顶部位图应该被擦除。 我从这个线程中得到了帮助。 Make certain area of bitmap transparent on touch。我可以通过圆圈看到底部位图,但顶部位图在触摸时没有擦除。如何在触摸时擦除位图。我知道以前有人问过这个问题,但我无法解决问题。

这是我的代码:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(new Panel(this));
}

class Panel extends View {
    Bitmap bmOverlay;
    private Paint mPaint;
    Bitmap bm2, bm1;
    Bitmap bitmap;
    Canvas pcanvas;

    int x = 0;
    int y = 0;
    int r = 0;

    public Panel(Context context) {
        super(context);
        setFocusable(true);
        setBackgroundColor(Color.TRANSPARENT);

        // setting paint
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.TRANSPARENT);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        mPaint.setAntiAlias(true);

        bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
        bm2 = BitmapFactory.decodeResource(getResources(), R.drawable.aaa);

        bmOverlay = Bitmap.createBitmap(bm1.getWidth(), bm1.getHeight(),
                Bitmap.Config.ARGB_8888);
        pcanvas = new Canvas(bmOverlay);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        // draw a circle that is erasing bitmap
        super.onDraw(canvas);
        canvas.drawBitmap(bm2, 0, 0, null);
        pcanvas.drawBitmap(bm1, 0, 0, null);
        pcanvas.drawCircle(x, y, 40, mPaint);
        canvas.drawBitmap(bmOverlay, 0, 0, null);

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // set parameter to draw circle on touch event

        switch (ev.getAction()) {

        case MotionEvent.ACTION_DOWN: {

            x = (int) ev.getX();
            y = (int) ev.getY();
            invalidate();

            break;
        }

        case MotionEvent.ACTION_MOVE: {

            x = (int) ev.getX();
            y = (int) ev.getY();
            invalidate();
            break;

        }

        case MotionEvent.ACTION_UP:

            break;

        }
        return true;
    }



}
}

【问题讨论】:

    标签: java android bitmap transparent


    【解决方案1】:

    您需要进行两项更改才能擦除顶部位图。首先,将其设为可变位图,以便在擦除内容时更改内容:

    Bitmap temp = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
    bm1 = temp.copy(Bitmap.Config.ARGB_8888, true); // mutable = true
    

    注意这里的内存不足错误。

    其次,在您的 onDraw 函数中,通过写回 bm1 来更新位图内容:

    @Override
    protected void onDraw(Canvas canvas) {
        // draw a circle that is erasing bitmap
        super.onDraw(canvas);
        canvas.drawBitmap(bm2, 0, 0, null);
        pcanvas.drawBitmap(bm1, 0, 0, null);
        pcanvas.drawCircle(x, y, 40, mPaint);
        canvas.drawBitmap(bmOverlay, 0, 0, null);
    
        // erase the top bitmap:
        Canvas bitmapCanvas = new Canvas(bm1);
        bitmapCanvas.drawBitmap(bm2, 0, 0, null);
        bitmapCanvas.drawBitmap(bmOverlay, 0, 0, null);
    }
    

    另外,当你启动应用程序时,要停止在左上角擦除一个圆,创建一个默认值为 false 的布尔值,并在你有有效坐标时将其设置在 onTouchEvent 中,并在调用 drawCircle 之前检查它.

    【讨论】:

    • 当我保存 bmoverlay 时,保存的图像在最后一次触摸的位置上有一个黑点。如何从保存的图像中删除这个黑点????
    • 正在尝试保存屏幕截图?尝试保存 bm1 而不是 bmOverlay。
    • 如果我尝试保存 bm1,只会保存第一个图像。我必须保存包含两个图像的 bmoverlay。问题只是最后触摸的区域上有一个黑点。图像的其余部分被正确擦除。
    • 调用 pcanvas.drawBitmap(bm1, 0, 0, null); (但不要在保存 bmOverlay 之前立即调用 drawCircle),希望黑点消失。
    • 确保保存的是 bmOverlay 而不是 bm1
    猜你喜欢
    • 2011-07-19
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2012-06-08
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多