0

ImageView背景と前景に描かれたパターンの 2 つのビットマップを含む があります。私がやりたいのは、前景に描かれたパターンを消去して、消去された部分に完全な背景が現れるようにすることです。私が理解した消去部分とこれは機能します。

私の問題は、タッチ位置を消去すると不正確になることです。これはBitmap、前景のキャンバスが のキャンバスと同じサイズではないためImageViewです。縮小せずに画面に合わせてImageViewサイズを変更します。onMeasure

この問題を解決するにはどうすればよいですか? 各ビットマップに 1 つずつ、2 つのイメージ ビューを使用することを考えましたが、このプロセスは面倒であり、パフォーマンスの問題も引き起こします。1 つまたは 2 つのビットマップを使用したいと思いImageViewます。

これが私の問題をもう少し説明するための私のコードです。

      final Paint pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
      pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
      pTouch.setColor(Color.TRANSPARENT);
      pTouch.setMaskFilter(new BlurMaskFilter(10, Blur.NORMAL));

      final Canvas c2 = new Canvas(_currentTextureBitmap);

      ImageView iv = new ImageView(this) {
            int x = 0;
            int y = 0;
            int _width;
            int _height;

            @Override
            public boolean onTouchEvent(MotionEvent ev) {

                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;

                }    

                }
                return true;
            }

            @Override 
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
                Drawable d = getDrawable();

                if(d!=null){
                    // ceil not round - avoid thin vertical gaps along the left/right edges
                    _width = MeasureSpec.getSize(widthMeasureSpec);
                    _height = (int) Math.ceil((float) _width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                    setMeasuredDimension(_width, _height);
                }else{
                    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                }
            }

            @Override
            public void onDraw(Canvas canvas){
                super.onDraw(canvas);

                if (_selectedImageURI != null)
                    if (_erase) {
                        //draw background
                        canvas.drawBitmap(_backgroundBitmap, null, new RectF(0, 0, _width, _height), null);

                        if (_currentTextureBitmap != null) {
                            c2.drawCircle(x, y, 40, pTouch);
                            canvas.drawBitmap(_currentTextureBitmap, null, new RectF(0, 0, _width, _height), null);
                        }
                    }
               }
        };
4

1 に答える 1

0

非常に簡単な解決策を見つけました。最大のキャンバスの幅を小さなキャンバスで割り、その float 値を使用して、タッチ時に設定された x 値と y 値を掛けただけです。これにより、より大きなキャンバスで消去するための正しい座標が得られました。

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    if (_erase) {
        //draw background
        canvas.drawBitmap(_originalBitmap, null, new RectF(0, 0, _width, _height), null);

        if (_overlay != null) { 
            float x = (_x * ((float)_overlay.getWidth()/_width));
            float y = (_y * ((float)_overlay.getHeight()/_height));

            _canvasOverlay.drawCircle(x, y, 40, _touch);
            canvas.drawBitmap(_overlay, null, new RectF(0, 0, _width, _height), null);
        }
    }
}
于 2013-03-05T08:47:47.330 に答える