Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓:在画布上绘制背景图片_Android_Android Canvas - Fatal编程技术网

Android 安卓:在画布上绘制背景图片

Android 安卓:在画布上绘制背景图片,android,android-canvas,Android,Android Canvas,当用户触摸屏幕时,我尝试隐藏图片并以交互方式显示其部分。我尝试了很多方法,比如背景视图与我将使其透明的视图重叠,这在某种程度上是有效的。最终的解决方案应该是一个单一的自定义视图,这将给我更多的绘画灵活性 活动: hiddenPicture.setBackgroundResource(R.drawable.picture); 视图: 问题是椭圆形是黑色的。我发现了很多类似的问题,但我在安卓系统方面太初级了,无法将它们应用到我的案例中。我该怎么做才能抹去灰色面纱中的椭圆形并显示背景图片?多谢各位

当用户触摸屏幕时,我尝试隐藏图片并以交互方式显示其部分。我尝试了很多方法,比如背景视图与我将使其透明的视图重叠,这在某种程度上是有效的。最终的解决方案应该是一个单一的自定义视图,这将给我更多的绘画灵活性

活动:

hiddenPicture.setBackgroundResource(R.drawable.picture);
视图:

问题是椭圆形是黑色的。我发现了很多类似的问题,但我在安卓系统方面太初级了,无法将它们应用到我的案例中。我该怎么做才能抹去灰色面纱中的椭圆形并显示背景图片?多谢各位

更新:

我发现很好的博客:

我将其回收到我的代码中:

    fillBMP = BitmapFactory.decodeResource(context.getResources(), R.drawable.picture);
    fillBmpShader = new BitmapShader(fillBMP, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    eraserPaint.setColor(0xFFFFFFFF);
    eraserPaint.setStyle(Paint.Style.FILL);
    eraserPaint.setShader(fillBmpShader);
它似乎可以工作,但问题是它不能缩放用作画笔的图像。确实是通过以下方式实现
onDraw()
的唯一解决方案:

  • 画画
  • 除未遮盖的部分外,给面纱上漆

  • 我担心演出。我不想在每次用户交互后绘制完整的屏幕。我宁愿只重新油漆相关的部分。这是可能的还是我已经过度优化了?

    我必须维护并绘制两个位图-一个用于背景,另一个用于透明凹陷的面纱:

    private void setupDrawing() {
        eraserPaint = new Paint();
        eraserPaint.setColor(Color.TRANSPARENT);
        eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        veilPaint = new Paint();
        veilPaint.setColor(Color.GREEN);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }
    
    // http://developer.android.com/training/custom-views/custom-drawing.html
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
        drawCanvas.drawRect(0, 0, w, h, veilPaint);
    }
    
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(fillBitmap, 0, 0, canvasPaint);
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    }
    
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            drawCanvas.drawCircle(event.getX(), event.getY(), 150, eraserPaint);
            invalidate();
        }
        return true;
    }
    
    private void setupDrawing() {
        eraserPaint = new Paint();
        eraserPaint.setColor(Color.TRANSPARENT);
        eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        veilPaint = new Paint();
        veilPaint.setColor(Color.GREEN);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }
    
    // http://developer.android.com/training/custom-views/custom-drawing.html
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
        drawCanvas.drawRect(0, 0, w, h, veilPaint);
    }
    
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(fillBitmap, 0, 0, canvasPaint);
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    }
    
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            drawCanvas.drawCircle(event.getX(), event.getY(), 150, eraserPaint);
            invalidate();
        }
        return true;
    }