绘制到ImageView上

时间:2010-08-17 14:50:45

标签: android drawing

我现在研究了Androidreference几个小时,但是并没有真正得到如何在ImageView上绘制内容(Text,Bitmap,Path ....)的线索。

我应该扩展View并使用onDraw() - 方法吗?如果是,我如何在我的ImageView上绘图?

或者还有其他方法可以实现我的目标吗?

3 个答案:

答案 0 :(得分:4)

如果您只想在ImageView上绘制另一个位图并且它不应该是动态的,那么请使用AbsoluteLayout并将它们放在彼此之上。

如果它应该更加动态,我建议使用SurfaceView。可以在此处找到教程:http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

(目前仅通过webarchive在线:http://web.archive.org/web/20121005111921/http://www.droidnova.com/2d-tutorial-series

答案 1 :(得分: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);
    }
  }

答案 2 :(得分:0)

SurfaceView就是你想要的。它会使用Canvascanvas.drawCircle(...)canvas.drawText(...)为您提供一个canvas.drawBitamp(...)对象。