2013-06-04 59 views
1

我正在寫一個類似於app的刮刮卡,並且我使用了SurfaceView。 我用某種顏色填充它,然後用PorterDuff.Mode.CLEAR PorterDuffXfermode在其上繪製一些路徑。我必須確定用戶何時完全抓取它(SurfaceView的畫布完全透明)。任何人都可以給我一些建議,如何識別它?識別表面視圖是否完全透明

我試着保存路徑的座標,但由於繪圖描邊寬度,我無法很好地計算覆蓋區域。

我試圖從SurfaceView的getDrawingCache方法獲取一個位圖,並迭代其像素並使用getPixel方法。它不起作用,我認爲這不是檢查畫布的有效方法。

回答

0

假設畫布不會很大或可縮放到任意大小,我認爲循環遍歷像素會很有效。

給定一個大尺寸或任意尺寸的畫布,我會創建一個畫布的數組表示形式,並隨時標記像素,以保持計數用戶至少有多少次擊中。然後根據閾值測試該數字,該閾值確定必須刮擦多少票據才能被視爲「刮掉」。傳入的僞代碼

const int count = size_x * size_y; // pixel count 
const int threshhold = 0.8 * count // user must hit 80% of the pixels to uncover 
const int finger_radius = 2; // the radias of our finger in pixels 
int scratched_pixels = 0; 
bit [size_x][size_y] pixels_hit; // array of pixels all initialized to 0 

void OnMouseDown(int pos_x, int pos_y) 
{ 
    // calculates the mouse position in the canvas 
    int canvas_pos_x, canvas_pos_y = MousePosToCanvasPos(pos_x, pos_y); 
    for(int x = canvas_pos_x - finger_rad; x < canvas_pos_x + brush_rad; ++x) 
    { 
     for(int y = canvas_pos_y - finger_rad; y < canvas_pos_y + brush_rad; ++y) 
     { 
      int dist_x = x - canvas_pos_x; 
      int dist_y = y - canvas_pos_y; 
      if((dist_x * dist_x + dist_y * dist_y) <= brush_rad * brush_rad 
       && pixels_hit[x][y] == 0) 
      { 
       ++scratched_pixels; 
       pixels_hit[x][y] = 1; 
      } 
     } 
    } 
} 

bool IsScratched() 
{ 
    if(scratched_pixels > threshhold) 
     return true; 
    else 
     return false; 
} 
+0

謝謝您的意見。我可以跟蹤手指的位置,但最終沒有給出正確的結果,因爲我在畫布上繪製了一些筆畫寬度的路徑。 – viplezer

+0

在這種情況下,將手指表示爲圓形並查找所有圓形相交的像素。然後測試它們,而不是單個展示。如果需要,我可以提供一些僞代碼。 – DubiousPusher

+0

我已經完成了,解決方案與您在上一條評論中所說的相似。如果你把它寫成答案,我會接受它。 – viplezer