2014-07-23 91 views
1

我有一個活動,用戶觸摸圖片上的眼睛位置,這應該在每個圖片上畫一個白色的圓圈。我有一段代碼,使用Android FaceDetector工具查找眼睛位置和麪部中點並繪製矩形。該代碼的繪圖部分僅供參考:奇怪的畫布/位圖問題

private void drawRectangles(){ 
    Canvas canvas = new Canvas(mBitmap); 
    Paint paint = new Paint(); 
    paint.setStrokeWidth(2); 
    paint.setColor(Color.BLUE); 
    paint.setStyle(Style.STROKE); 

    for (int i=0; i < faceFrames.length; i++) { 
     RectF r = faceFrames[i]; 
     if (r != null){ 
      canvas.drawRect(r, paint); 
      Log.d(TAG, "Drew rectangle"); 
     } 
    } 
    mImageView.setImageResource(0); 
    mImageView.setImageBitmap(mBitmap); 
    mImageView.draw(canvas);  
} 

這部分沒有問題。我想,因爲一個被從調用的onTouchEvent方法,我可以使用以下方法來繪製一個圓:

private void makeDrawableLayer(int x, int y, int touchCount){ 
    if (touchCount == 1){ 
     Bitmap eyeOneBmp = Bitmap.createBitmap(mBitmap); 
     Canvas c1 = new Canvas(eyeOneBmp); 
     c1.drawCircle(x, y, 5, eyePaint); 

     mImageView.setImageResource(0); 
     mImageView.setImageBitmap(eyeOneBmp); 
     mImageView.draw(c1); 

    } 
} 

以下是示出每個代碼段的結果的屏幕截圖。第一張照片是在臉上繪製的矩形。第二張圖片顯示了當我嘗試使用第二個代碼段進行繪製時得到的非常奇怪的結果。但請注意,繪製第二個輸出時,我已將x和y指定爲10,10作爲圓的位置。當我給它傳入的眼睛位置座標時,就是同樣的事情,只是像素化的圓圈來自任何眼睛。

有沒有人知道這種行爲會發生什麼?

非常感謝。

enter image description here enter image description here

+0

爲什麼你叫mImageView.draw (C1)?這會將ImageView繪製到位圖上。 – alanv

+0

@alanv - 我只是將ImageView繪製到位圖上,因爲我已經在矩形繪製方法中完成了該操作。如果我刪除那行代碼,根本沒有任何反應。 – nectaris

回答

0

所以我發現,你可以基本上只有一次需要進行擴展視圖開始從調用方法的類前畫到畫布上。我最終需要做的是:customView.prepareCircle(),customView.invalidate(),然後是parentView.addView(customView)。實際上,我只能在UI線程上從Runnable進行任何後續調用之前,只准備,無效並將修改後的自定義視圖重新添加到畫布。我不是印象中,這是做到這一點(當然不感覺優雅)的理想方式,但它給我我想要的結果:

enter image description here