2013-02-15 79 views
3

弧在我的Android應用程序,我想提供跟蹤信功能,如以下的圖像:Android的畫布 - 之間畫弧點和刪除路徑

enter image description here

在這裏,我想提供一個跟蹤字母D,爲此我需要在用戶開始在弧上移動手指時在兩點之間繪製弧線。在這裏,如果用戶從開始點開始移動手指並在結束點停止,那麼只有它應該在這些點之間繪製弧線。在弧線路徑上移動手指時也應該顯示弧線。爲此,我寫了下面的代碼。我面臨的問題是,當在弧線路徑上觸發ACTION_UP事件時,它仍然在畫布上顯示弧形繪圖。但是,如果在弧路徑之間觸發事件,我想從路徑中移除該繪圖。

這裏是我的代碼:

public class DrawView extends View implements OnTouchListener { 

List<Point> pointsD = new ArrayList<Point>(); 
pointsD.add(new Point(520, 70)); 
    pointsD.add(new Point(520, 335)); 
    pointsD.add(new Point(520, 70)); 
    pointsD.add(new Point(520, 335)); 

public boolean onTouch(View view, MotionEvent event) { 

    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     touch_start(x, y); 
     invalidate(); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     touch_move(x, y); 
     invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
     touch_up(x, y); 
     invalidate(); 
     break; 
    default: 
     break; 
    } 
    return true; 
} 
private void touch_start(float x, float y) { 
     if (checkPoint(x, y, mLastPointIndex)) { 
       mPath.reset(); 
      isPathStarted = true; 
      } else { 
      isPathStarted = false; 
     } 
} 

private void touch_move(float x, float y) { 

    if (isPathStarted) { 
     mPath.reset(); 
     Point p = null; 
     p = pointsD.get(mLastPointIndex); 
     mPath.moveTo(p.x, p.y); 
      float radius = 1; 
     RectF oval = new RectF(); 
     oval.set(scalePointX((int) (486 - radius)),scalePointY(70),        scalePointX((int) (686 + radius)), 
         scalePointY((int) (334 + radius))); 
     if (sweepAngelD <= 180 && startAngleD <= 360) { 
      mPath.arcTo(oval, startAngleD, sweepAngelD, true); 
     sweepAngelD += 1; 
     startAngleD += 2; 
     mCanvas.drawPath(mPath, mPaint); 
    } 
    mPath.reset(); 
} 

private void touch_up(float x, float y) { 
     mPath.reset(); 
      if (isPathStarted) { 
       float radius = 1; 
       RectF oval = new RectF(); 
       oval.set(scalePointX((int) (486 - radius)), 
         scalePointY(70), scalePointX((int) (686 + radius)), 
         scalePointY((int) (334 + radius))); 
       Point p = pointsD.get(mLastPointIndex); 
       mPath.moveTo(p.x, p.y); 
       mPath.arcTo(oval, startAngleD, sweepAngelD, true);     
       mCanvas.drawPath(mPath, mPaint); 
       mPath.reset(); 
       ++mLastPointIndex; 
      } else { 
       sweepAngelD = 1; 
       startAngleD = 270; 
       mPath.reset(); 
      } 
      isPathStarted = false; 
} 

private boolean checkPoint(float x, float y, int pointIndex){ 
if (pointIndex == pointsD.size()) { 
      // out of bounds 
      return false; 
     } 
     point = pointsD.get(pointIndex); 
     // EDIT changed point.y to poin.x in the first if statement 
     if (x > (point.x - TOUCH_TOLERANCE) 
       && x < (point.x + TOUCH_TOLERANCE)) { 
      if (y > (point.y - TOUCH_TOLERANCE) 
        && y < (point.y + TOUCH_TOLERANCE)) { 
       return true; 
      } 
     } 
    return false; 
} 
} 
+0

:請幫我,什麼是scalePointX,在代碼scalePointY方法?謝謝 – Arash 2013-12-26 10:43:12

+0

@arash此方法將根據不同的設備維護每個點的座標值。 – zanky 2013-12-26 11:39:28

回答

3

我編輯下面我的代碼,現在它正在..

public class DrawView extends View implements OnTouchListener { 

List<Point> pointsD = new ArrayList<Point>(); 
pointsD.add(new Point(520, 70)); 
    pointsD.add(new Point(520, 335)); 
    pointsD.add(new Point(520, 70)); 
    pointsD.add(new Point(520, 335)); 

public boolean onTouch(View view, MotionEvent event) { 

    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     touch_start(x, y); 
     invalidate(); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     touch_move(x, y); 
     invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
     touch_up(x, y); 
     invalidate(); 
     break; 
    default: 
     break; 
    } 
    return true; 
} 
private void touch_start(float x, float y) { 
     if (checkPoint(x, y, mLastPointIndex)) { 
       mPath.reset(); 
      isPathStarted = true; 
      } else { 
      isPathStarted = false; 
     } 
} 

private void touch_move(float x, float y) { 

    if (isPathStarted) { 
     mPath.reset(); 
     Point p = null; 
     p = pointsD.get(mLastPointIndex); 
     mPath.moveTo(p.x, p.y); 
      float radius = 1; 
     RectF oval = new RectF(); 
     oval.set(scalePointX((int) (486 - radius)),scalePointY(70),        scalePointX((int) (686 + radius)), 
         scalePointY((int) (334 + radius))); 
     if (sweepAngelD <= 180 && startAngleD <= 360) { 
      mPath.arcTo(oval, startAngleD, sweepAngelD, true); 
     sweepAngelD += 1; 
     startAngleD += 2; 

    } 
    mPath.reset(); 
} 

private void touch_up(float x, float y) { 
     mPath.reset(); 
      if (isPathStarted) { 
       float radius = 1; 
       RectF oval = new RectF(); 
       oval.set(scalePointX((int) (486 - radius)), 
         scalePointY(70), scalePointX((int) (686 + radius)), 
         scalePointY((int) (334 + radius))); 
       Point p = pointsD.get(mLastPointIndex); 
       mPath.moveTo(p.x, p.y); 
       mPath.arcTo(oval, startAngleD, sweepAngelD, true);     
       mCanvas.drawPath(mPath, mPaint); 
       mPath.reset(); 
       ++mLastPointIndex; 
      } else { 
       sweepAngelD = 1; 
       startAngleD = 270; 
       mPath.reset(); 
      } 
      isPathStarted = false; 
} 

private boolean checkPoint(float x, float y, int pointIndex){ 
if (pointIndex == pointsD.size()) { 
      // out of bounds 
      return false; 
     } 
     point = pointsD.get(pointIndex); 
     // EDIT changed point.y to poin.x in the first if statement 
     if (x > (point.x - TOUCH_TOLERANCE) 
       && x < (point.x + TOUCH_TOLERANCE)) { 
      if (y > (point.y - TOUCH_TOLERANCE) 
        && y < (point.y + TOUCH_TOLERANCE)) { 
       return true; 
      } 
     } 
    return false; 
} 
} 
+0

你是如何完成整件事的?我有一個顯示跟蹤字母的TextView,但我不確定如何在其上實現Canvas以允許用戶繪製。 – Si8 2013-08-20 20:13:15

+1

我創建了png圖像來顯示跟蹤信件並在畫布上繪製該位圖圖像。之後,我在屏幕上繪製了不同的座標點,然後我處理了點上的觸摸功能,就像你在我的代碼中看到的一樣。 – zanky 2013-08-22 05:21:46

+0

我在我的App中得到了使用自定義字體顯示的字母,但是您是如何得到'1'和'2'的? – Si8 2013-08-22 14:17:41