2015-09-04 47 views
1

我正在尝试制作一个应用程序,用户单击图像。 点击图片后,会出现3个矩形,可以根据图片中的文字进行移动和调整大小。Android中的可调整大小的矩形覆盖

所以我的问题是如何使这3个矩形在视图从图像的一部分选择文本

请帮我做出这个问题

回答

0

它不正是你想要的解决方案,但这个例子显示如何绘制一个单一的矩形超过ImageView和缩放/移动它:

public class OverlayImageView extends ImageView { 

    private static final int INVALID_POINTER_ID = -1; 

    private float mPosX; 
    private float mPosY; 

    private float mLastTouchX; 
    private float mLastTouchY; 
    private int mActivePointerId = INVALID_POINTER_ID; 

    private ScaleGestureDetector mScaleDetector; 
    private float mScaleFactor = 1.f; 

    private Rect mInitialRect; 
    private Paint mDrawPaint; 

    public OverlayImageView(Context context) { 
     this(context, null, 0); 
    } 

    public OverlayImageView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public OverlayImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 

     mDrawPaint = new Paint(); 
     mDrawPaint.setColor(Color.RED); 
     mDrawPaint.setStyle(Paint.Style.STROKE); 
     mDrawPaint.setStrokeWidth(5); 
     mInitialRect = new Rect(10, 10, 100, 100); 
    } 

    @Override 
    public boolean onTouchEvent(@NonNull MotionEvent ev) { 
     // Let the ScaleGestureDetector inspect all events. 
     mScaleDetector.onTouchEvent(ev); 

     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 
       mActivePointerId = ev.getPointerId(0); 
       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 

       // Only move if the ScaleGestureDetector isn't processing a gesture. 
       if (!mScaleDetector.isInProgress()) { 
        final float dx = x - mLastTouchX; 
        final float dy = y - mLastTouchY; 

        mPosX += dx; 
        mPosY += dy; 

        invalidate(); 
       } 

       mLastTouchX = x; 
       mLastTouchY = y; 

       break; 
      } 

      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_CANCEL: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_POINTER_UP: { 
       final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
         >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
       final int pointerId = ev.getPointerId(pointerIndex); 
       if (pointerId == mActivePointerId) { 
        // This was our active pointer going up. Choose a new 
        // active pointer and adjust accordingly. 
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
        mLastTouchX = ev.getX(newPointerIndex); 
        mLastTouchY = ev.getY(newPointerIndex); 
        mActivePointerId = ev.getPointerId(newPointerIndex); 
       } 
       break; 
      } 
     } 

     return true; 
    } 

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

     canvas.save(); 
     canvas.translate(mPosX, mPosY); 
     canvas.scale(mScaleFactor, mScaleFactor); 
     canvas.drawRect(mInitialRect, mDrawPaint); 
     canvas.restore(); 
    } 

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      mScaleFactor *= detector.getScaleFactor(); 

      // Don't let the object get too small or too large. 
      mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); 

      invalidate(); 
      return true; 
     } 
    } 
} 
+0

感谢您的帮助。我已经做了矩形,但我想要三个矩形可聚焦,当我试图添加这些矩形一个是可以聚焦和其他两个不能正常工作。帮助,如何添加两个可调整大小的矩形。 – Corrupt

+0

@Corrupt你可以存储矩形的数组,并在onTouchEvent中检测哪一个位于MotionEvent中。在onDraw方法中绘制每个矩形缩放。 – Oleksandr