2013-04-14 95 views
0

我正試圖做一個允許用戶「畫」的視圖。現在我所做的就是路徑,然後用一條線連接它,但不能正常工作,它工作緩慢並使事情變得「奇怪」。你可以看到在這個視頻http://youtu.be/PUSUTFhDPrM,對不起,它有點快,但你可以看到我在說什麼。爲什麼它畫慢?還是奇怪?

我實際的代碼是:

public class DrawView extends View implements OnTouchListener { 

private static final String TAG = "DrawView"; 

private List<List<Point>> _paths = new ArrayList<List<Point>>(); 
private List<Point> _lastPath; 
private Paint _paint = new Paint(); 
private Path _path = new Path(); 

public DrawView(Context context) { 
    super(context); 

    setFocusable(true); 
    setFocusableInTouchMode(true); 
    setOnTouchListener(this); 

    _paint.setColor(Color.BLACK); 
    _paint.setStyle(Paint.Style.STROKE); 
    _paint.setStrokeWidth(5); 
    _paint.setAntiAlias(true); 
} 
public DrawView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setFocusable(true); 
    setFocusableInTouchMode(true); 
    setOnTouchListener(this); 

    _paint.setColor(Color.BLACK); 
    _paint.setStyle(Paint.Style.STROKE); 
    _paint.setStrokeWidth(5); 
    _paint.setAntiAlias(true); 
} 

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

    setFocusable(true); 
    setFocusableInTouchMode(true); 
    setOnTouchListener(this); 

    _paint.setColor(Color.BLACK); 
    _paint.setStyle(Paint.Style.STROKE); 
    _paint.setStrokeWidth(5); 
    _paint.setAntiAlias(true); 
} 

@Override 
protected void onDraw(Canvas canvas) { 

    for (List<Point> pointsPath : _paths) { 
     _path.reset(); 
     boolean first = true; 

     for (int i = 0; i < pointsPath.size(); i += 2) { 
      Point point = pointsPath.get(i); 

      if (first) { 
       first = false; 
       _path.moveTo(point.x, point.y); 
      } else if (i < pointsPath.size() - 1) { 
       Point next = pointsPath.get(i + 1); 
       _path.quadTo(point.x, point.y, next.x, next.y); 
      } else { 
       _path.lineTo(point.x, point.y); 
      } 
     } 
     canvas.drawPath(_path, _paint); 
    } 
} 

public boolean onTouch(View view, MotionEvent event) { 
    Point point = new Point(); 
    point.x = event.getX(); 
    point.y = event.getY(); 
    Log.d(TAG, "point: " + point); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     _lastPath = new ArrayList<Point>(); 
     _lastPath.add(point); 
     _paths.add(_lastPath); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     _lastPath.add(point); 
     break; 
    } 
    invalidate(); 
    return true; 
} 

private class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 
public void changePaint(int Stroke, int color){ 

    _path.reset(); 

    _paint.setColor(color); 
    _paint.setStyle(Paint.Style.STROKE); 
    _paint.setStrokeWidth(Stroke); 
    _paint.setAntiAlias(true); 

} 

} 

我要的是知道是否有更好的方法來讓用戶「畫」用手指或者我有什麼可以改善刪除這個最慢的部分碼。

回答

1

你的繪製操作很好。繪畫時要做的更糟糕的事情是實例化新對象,而你不這樣做。

要評論@ Atermis的答案,實際上「繪製背景」沒有多大意義。如果在UI線程中繪製Android線程,如果你有大量計算繪製,那麼是的,這可能是有用的,但這裏更簡單的解決方案是:雙緩衝區。

要麼你可以使用表面視圖和lockCanvas或者你可以在一個內存緩衝區中繪製,然後在一個單一的操作中顯示它,如下所述:http://www.mail-archive.com/[email protected]/msg03172.html

+0

如果我實現lockCanvas,我的線將在finge觸摸屏幕的同時繪製? –

2

可能問題在於您在UI線程上執行此操作,請嘗試在後臺線程上執行此操作。

+0

我該怎麼做?我如何在後臺使用線程? –

+1

看看這個視頻http://www.youtube.com/watch?v=Z2YogvILjvo這是一個在畫布上繪製東西的好例子http://android-journey.blogspot.co.il/2010/02 /android-2d-simple-example.html – Artemis