2012-12-23 26 views
4

我發現這個小樣本代碼,做你的手指畫:
http://marakana.com/tutorials/android/2d-graphics-example.html繪圖用手指

下面是一些相關的代碼:

List<Point> points = new ArrayList<Point>(); 

@Override 
public void onDraw(Canvas canvas) { 
    for (Point point : points) { 
     canvas.drawCircle(point.x, point.y, 5, paint); 
    } 
} 

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

我一直在尋找通過它,看到他們正在給ArrayList添加點,然後循環遍歷ArrayList,這似乎並不是一個非常優化的方法。有更好的方法還是這是一個好方法?

經過我的三星GS3測試後,我用20的圓圈大小着色了整個屏幕,並且越接近全色,繪製越慢,然後圓圈變得間隔開。

+0

你的問題不是很具體。如果你可以發佈一些代碼會更好。 – NSAddict

+0

你可能會對'onDraw'的教程期待太多。 –

+0

這取決於你想繪製什麼:路徑,圓形,方形等。 – hardartcore

回答

1

不,這個例子中是有道理的。

他循環所有他想畫的點。 這意味着他將每個點都添加到數組中,因此他可以一次循環所有對象。

你會經常在遊戲編程中看到這一點。


這也是非常可擴展的。

  1. ,只要你想
  2. 您可以添加儘可能多的積分,支持多態
  3. 您不必爲做多點變量>更少的代碼
+1

我相信他會問更多關於優化的問題。不斷給列表添加點是一個糟糕的主意。如果IE點不再可見,則可以刪除它,或者如果點已經存在於列表中,則可以忽略它。 – AlanFoster

+1

@AlanFoster是的,當然,在將它們添加到數組之前,您必須先進行驗證檢查。否則,你會很快失去記憶。 – NSAddict

1

首先,使用行程(不畫圈)畫線。其次,近似。這裏有一個總結:

  1. 更改Paint使用中風與width=5。這減少了畫這麼多圈子的需要。
  2. 選擇一個閾值,例如3px之後您將在onTouch()中添加一個點。

    if (Math.abs(previousX - event.getX()) < THRESHOLD 
         && Math.abs(previousY - event.getY()) < THRESHOLD) { 
        return; 
    } 
    previousX = event.getX(); 
    previousY = event.getY(); 
    // drawing update goes here 
    

    這應該減少(不明顯)點的數量。

  3. 使用PicturePath類來劃線,並使用Canvas.drawPath()Canvas.drawPicture()。這對於大量的點來說尤其如此,因爲所有的繪圖命令都會在一次調用中傳遞給內部繪圖函數,所以這樣做的確會加快繪圖速度。

  4. 根據需要簡化形狀。例如,你可以刪除最老的點(這將是一個完美的案例,使用circular buffer),使用Ramer-Douglas-Peucker algorithm這是很容易實現,給出了良好的結果,並具有O(nlogn)的複雜性。

+0

您的閾值示例是否工作?它不應該是邏輯的'和'而不是邏輯'或'? – AlanFoster

+0

@AlanFoster是的,當然你是對的。我在我的答案中更新了代碼。 – andr