2011-09-23 30 views
18

Tôi đang phát triển một ứng dụng mà tôi đang dán hình ảnh, vẽ và vẽ trên canvas. Ứng dụng này cũng có thể tăng/giảm kích thước canvas hoặc kéo nó đến vị trí khác. Vấn đề của tôi là: Tôi không thể có được tọa độ canvas chính xác sau khi chia tỷ lệ hoặc kéo canvas. Tôi muốn vẽ sơn ngón tay sau khi vải được thu nhỏ hoặc kéo nhưng không thể lấy lại đúng nơi mà tôi đã chạm vào .. :( Cũng Tôi ong mới. Đây là đoạn mã.Nhận tọa độ Canvas sau khi tăng/giảm tỷ lệ hoặc kéo trong android

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

    canvas.save(); 
    //canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor, super.getWidth() * 0.5f, 
      super.getHeight() * 0.5f); 
    mIcon.draw(canvas); 
    for (Path path : listPath) { 
     canvas.drawPath(path, paint); 
    } 
    canvas.restore(); 
} 

public TouchExampleView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

} 

@Override 
public boolean onTouchEvent(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; 
    } 
    } 

    float objectNewX,objectNewY; 
    if (mScaleFactor >= 1) { 
     objectNewX = ev.getX() + (ev.getX() - super.getWidth() * 0.5f) * (mScaleFactor - 1); 
     objectNewY = ev.getY() + (ev.getY() - super.getHeight() * 0.5f) * (mScaleFactor - 1); 
    } else { 
     objectNewX = ev.getX() - (ev.getX() - super.getWidth() * 0.5f) * (1 - mScaleFactor); 
     objectNewY = ev.getY() - (ev.getY() - super.getHeight() * 0.5f) * (1 - mScaleFactor); 
    } 

    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     path = new Path(); 
     path.moveTo(objectNewX,objectNewY); 
     path.lineTo(objectNewX,objectNewY); 
    } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { 
     path.lineTo(objectNewX,objectNewY); 
     listPath.add(path); 
    } else if (ev.getAction() == MotionEvent.ACTION_UP) { 
     path.lineTo(objectNewX,objectNewY); 
     listPath.add(path); 
    } 

    return true; 
} 

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, 5.0f)); 

     invalidate(); 
     return true; 
    } 
} 
+0

* Tôi không thể nhận tọa độ canvas chính xác *. Bạn cần phải được cụ thể hơn. Bản thân quy mô có hoạt động không? Xác định những gì bạn mong đợi dưới dạng * tọa độ canvas chính xác *? Điều gì là sai với họ ngay bây giờ? – Knickedi

+0

cố gắng phóng to hình ảnh và sau đó vẽ một cái gì đó trên canvas..then u'll đến để biết. –

+0

cũng bỏ ghi chú canvas.translate (mPosX, mPosY); –

Trả lời

19

Done . nó cuối cùng một mình

Vẽ tất cả mọi thứ bằng cách áp dụng công thức này để (px, py) phối:

float px = ev.getX()/mScaleFactor + rect.left; 
float py = ev.getY()/mScaleFactor + rect.top; 
rect = canvas.getClipBounds(); 
//Get them in on Draw function and apply above formula before drawing 
+0

Hey awais Tôi cũng bị mắc kẹt ở cùng một điều. Tôi đã không hiểu giải pháp của bạn đúng cách, bạn có thể vui lòng chia sẻ mã ur hoặc giúp tôi với cùng không? – user1169079

+0

vấn đề của bạn ở đâu ??? Trong trường hợp của tôi, nơi tôi phải vẽ một cái gì đó trên màn hình, tôi sử dụng float x = ev.getX()/mScaleFactor + rect.left; cho X thay vì event.getX(); tương tự cho trục Y. Rect là clipbounds của canvas vẽ. Chúng ta phải lưu nó trong một số biến hình chữ nhật. Chúng liên tục cập nhật trong hàm onDraw. –

+0

http://stackoverflow.com/questions/9989170/clickable-area-after-scaling-with-respect-to-positions-of-touch-event .. kiểm tra điều này nếu u có thể giúp nó sẽ là tuyệt vời ... – user1169079

7
@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    clipBounds_canvas = canvas.getClipBounds(); 
    /////Do whatever you want to do..!!!    
}; 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    int x = ev.getX()/zoomFactor + clipBounds_canvas.left; 
    int y = ev.getY()/zoomFactor + clipBounds_canvas.top; 
    //Use the above two values insted of ev.getX() and ev.getY(); 
} 

Hy vọng điều này sẽ giúp

.
+0

Hai giá trị trên x và y này là giá trị bù trừ khi vùng/lần nhấp của tôi sẽ là? Hoặc tôi cần phải cập nhật đối tượng vẽ của tôi bằng cách sử dụng giá trị x và y ở trên? – user1169079

+0

bạn cần phải cập nhật đối tượng vẽ tôi đoán theo x và y tương đối đã đề cập ở trên. –

+0

Cảm ơn bạn đời !!! Tôi đã có nơi đối tượng của tôi đang di chuyển .. nhưng tôi không làm thế nào để di chuyển khu vực có thể nhấp vào cùng một vị trí tôi đang làm việc trên .. nếu bạn có bất kỳ ý tưởng làm đề nghị !!! Tôi đã thử getHitRect và thêm bù đắp nó vào nó? dint làm việc !!! – user1169079

Các vấn đề liên quan