【发布时间】:2010-08-17 14:50:44
【问题描述】:
我已经研究了几个小时的 Androidreference,但并没有真正了解如何在 ImageView 上绘制一些东西(文本、位图、路径 ....)。
我应该扩展 View 并使用onDraw()-方法吗?如果是,我如何在 ImageView 上绘图?
或者还有其他方法可以实现我的目标吗?
【问题讨论】:
我已经研究了几个小时的 Androidreference,但并没有真正了解如何在 ImageView 上绘制一些东西(文本、位图、路径 ....)。
我应该扩展 View 并使用onDraw()-方法吗?如果是,我如何在 ImageView 上绘图?
或者还有其他方法可以实现我的目标吗?
【问题讨论】:
如果您只想在 ImageView 上绘制另一个位图并且它不应该是动态的,那么请使用 AbsoluteLayout 并将它们放在彼此之上。
如果它应该更加动态,我建议使用 SurfaceView。教程可以在这里找到:http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html
(目前仅通过网络存档在线:http://web.archive.org/web/20121005111921/http://www.droidnova.com/2d-tutorial-series)
【讨论】:
是的,您可以使用 onDraw 方法。有一个 Canvas 对象传递到该方法中,您将使用它在视图上绘制。这是一个如何做到这一点的示例...取自斑马线条形码扫描仪应用程序。它是显示深色外框、红色扫描线和黄色扫描结果点的视图。
@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);
}
}
【讨论】:
SurfaceView 是你想要的。它会给你一个Canvas 对象,你可以使用canvas.drawCircle(...)、canvas.drawText(...)、canvas.drawBitamp(...) 在其上绘图。
【讨论】: