2013-02-26 2 views
0

У меня есть ImageView, который содержит два растровых изображения фона и рисунка, нарисованного на переднем плане. То, что я хочу сделать, это удалить шаблон, нарисованный на переднем плане, чтобы весь фон был обнаружен на стертых деталях. Исчерпывающая часть, которую я выяснил, и это работает.Удалить текстуру на оверлейном растровом изображении - Android

Моя проблема в том, что при стирании позиции касания неточно. Это связано с тем, что размер Bitmap на холсте переднего плана не совпадает с размером холста ImageView. Я изменяю размер моего ImageView в методе onMeasure, чтобы соответствовать экрану, не уменьшая его.

Как решить эту проблему? Я думал об использовании двух видов изображений, по одному для каждого растрового изображения, но этот процесс утомителен, а также вызывает проблемы с производительностью. Я хотел бы использовать один 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); 
         } 
        } 
       } 
     }; 

ответ

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); 
     } 
    } 
} 
Смежные вопросы