3

我的应用程序有一个功能,可以让用户捕捉照片并在该照片上添加绘图。

所有照片的大小都重新调整为精确900 x 900。允许用户向图像添加绘图。我保留了一个transparent imageoriginal image在透明图像上进行绘图。绘图是使用canvas.

但是当在具有720 x 480(高度 x 宽度)的设备中绘图时。如果我创建一个900 x 900透明图像并从 to 画一条线0,0900,900画布只从0,0to画线480,480

以下是代码的相应部分:

准备画布:

holder = getHolder();
if (holder.getSurface().isValid()) {

    Canvas canvas = holder.lockCanvas();
    canvas.drawColor(Color.TRANSPARENT,  PorterDuff.Mode.CLEAR);
    /* original image is 900 x 900 */
    overlayBitmap = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig());
    canvas.setBitmap(overlayBitmap);
}

画线:

canvas.drawLine(0, 0, 900, 900, paint);

我不知道为什么我会遇到这个问题。是因为使用canvas??有什么解决办法吗?非常感谢任何帮助:-)

4

2 回答 2

1

经过更多阅读canvas并获得这篇文章的帮助后,我能够解决这个问题。

问题在canvas clip rectangle. 我猜这是(0,0,480,480)默认情况下的设备显示?720 x 480所以位图上的任何东西总是被剪裁为480 x 480.

后来我像这样修改了我的代码:

holder = getHolder();
if (holder.getSurface().isValid()) {

    Canvas canvas = holder.lockCanvas();
    canvas.drawColor(Color.TRANSPARENT,  PorterDuff.Mode.CLEAR);
    /* original image is 900 x 900 */
    overlayBitmap = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig());
    canvas.setBitmap(overlayBitmap);

    /* set extended clip rectangle for the larger target bitmap */
    Rect clipRect = canvas.getClipBounds();
    clipRect.set(0, 0, image.getWidth(), image.getHeight());
    canvas.clipRect(clipRect, Region.Op.REPLACE);

}

图像大小替换剪辑矩形大小后,一切正常。

于 2016-02-11T10:57:51.867 回答
0

仅仅因为一张照片是 900x900,这并不意味着它在设备屏幕上显示时就是这么多像素。设备屏幕可以有非常不同的尺寸,当一个图像(或任何视图)被告知扩展它以适应屏幕,或以 dp(设备独立像素)测量时,设备像素的实际数量将取决于在设备屏幕上。

您的代码需要对这些差异敏感。绘制时,不要假设视图的画布大小。相反,询问视图有多大,并根据实际测量的尺寸进行所有绘图。

于 2016-02-11T05:23:08.740 回答