2010-08-17 113 views
1

我現在研究了幾小時的Android參考,但並沒有真正瞭解如何在ImageView上繪製某些東西(文本,位圖,路徑....)。在ImageView上繪製

我應該擴展查看並使用onDraw() -Method?如果是的話,我該如何在我的ImageView上繪圖?

或者還有其他方法可以實現我的目標嗎?

回答

4

如果您只是想在您的ImageView上繪製另一個位圖,並且它不應該是動態的,那麼要使用AbsoluteLayout並將它們放在彼此之上。

如果它應該更加動態,我推薦使用SurfaceView。該教程可以在這裏找到:(通過webarchive目前只有在線:http://web.archive.org/web/20121005111921/http://www.droidnova.com/2d-tutorial-serieshttp://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

+0

感謝您閱讀本教程,我將閱讀它。 – Alien 2010-08-17 15:03:15

+0

嗯....他也沒有在他的SurfaceView下有東西,但我不想有ImageView,也不想在它上面動態地繪製文本。任何想法如何實現? – Alien 2010-08-17 15:48:04

+0

你沒讀過這個系列的所有部分,對吧?忘記ImageView並在SurfaceView上繪製位圖。在此之上繪製您的文字。只要閱讀至少前三部分! – WarrenFaith 2010-08-18 08:53:16

0

SurfaceView是你想要的。它會給你一個Canvas物體,你可以使用canvas.drawCircle(...)canvas.drawText(...),canvas.drawBitamp(...)來繪製物體。

+0

好的,謝謝,我會讀參考SurfaceView,然後我認爲我將能夠實現我的目標 – Alien 2010-08-17 15:04:04

+0

如何在SurfaceView下使用ImageView(在基於XML的佈局中聲明),以便我可以繪製它? – Alien 2010-08-17 15:47:02

3

是的,你可以使用onDraw方法。有一個傳入該方法的Canvas對象,您將使用該對象在視圖上繪製。這裏是一個如何去做的例子...來自Zebra Crossing條碼掃描器應用程序。這是顯示黑色外框,紅色掃描儀線和黃色掃描結果點的視圖。

@Override 
public void onDraw(Canvas canvas) { 
    Rect frame = CameraManager.get().getFramingRect(); 
    if (frame == null) { 
     return; 
    } 
    int width = canvas.getWidth(); 
    int height = canvas.getHeight(); 
    Log.v("ViewfinderView", "Canvas size: " + width + ", " + height); 

    // Draw the exterior (i.e. outside the framing rect) darkened 
    paint.setColor(resultBitmap != null ? resultColor : maskColor); 
    canvas.drawRect(0, 0, width, frame.top, paint); 
    canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint); 
    canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint); 
    canvas.drawRect(0, frame.bottom + 1, width, height, paint); 

    if (resultBitmap != null) { 
     // Draw the opaque result bitmap over the scanning rectangle 
     paint.setAlpha(OPAQUE); 
     canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint); 
    } else { 

     // Draw a two pixel solid black border inside the framing rect 
     paint.setColor(frameColor); 
     canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint); 
     canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint); 
     canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint); 
     canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint); 

     // Draw a red "laser scanner" line through the middle to show decoding is active 
     paint.setColor(laserColor); 
     paint.setAlpha(SCANNER_ALPHA[scannerAlpha]); 
     scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length; 
     int middle = frame.height()/2 + frame.top; 
     canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint); 

     Collection<ResultPoint> currentPossible = possibleResultPoints; 
     Collection<ResultPoint> currentLast = lastPossibleResultPoints; 
     if (currentPossible.isEmpty()) { 
     lastPossibleResultPoints = null; 
     } else { 
     possibleResultPoints = new HashSet<ResultPoint>(5); 
     lastPossibleResultPoints = currentPossible; 
     paint.setAlpha(OPAQUE); 
     paint.setColor(resultPointColor); 
     for (ResultPoint point : currentPossible) { 
      canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6.0f, paint); 
     } 
     } 
     if (currentLast != null) { 
     paint.setAlpha(OPAQUE/2); 
     paint.setColor(resultPointColor); 
     for (ResultPoint point : currentLast) { 
      canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 3.0f, paint); 
     } 
     } 

     // Request another update at the animation interval, but only repaint the laser line, 
     // not the entire viewfinder mask. 
     postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom); 
    } 
    } 
+0

謝謝你的例子,這有點矯枉過正,但給了我一個想法如何實現我的目標。 – Alien 2010-08-17 15:02:44

+0

是的,這裏有很多......這只是我碰巧得到的一些資源。如果它真的幫助你,不要忘記點擊小號複選標記:) – iandisme 2010-08-17 17:42:47

+0

嗯,fredley的表面視圖提示也很棒,WarrenFaith的教程鏈接也很好,所以我不能真正地決定誰應該得到複選標記:) – Alien 2010-08-17 18:34:39