Android Canvas 绘制的尺寸不超过屏幕尺寸
Android Canvas not drawing more than screen dimensions
我的应用程序有一个功能,可以让用户拍摄照片并在照片上添加绘图。
所有照片的大小都重新调整为 900 x 900
。
允许用户向图像添加绘图。我在 original image
上保留一个 transparent image
并在透明图像上绘图。使用 canvas
.
完成绘制
但是在具有 720 x 480
(高 x 宽)的设备中绘图时。如果我创建一个 900 x 900
透明图像并从 0,0
画一条线到 900,900
,canvas 只画从 0,0
到 480,480
的线。
下面是代码的相应部分:
准备中Canvas:
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
??有什么解决办法吗?非常感谢任何帮助:-)
仅仅因为照片是 900x900,并不意味着它在设备屏幕上显示时就是那么多像素。设备屏幕可以有非常不同的尺寸,当图像(或任何与此相关的视图)被告知扩展其尺寸以适合屏幕,或以 dp(设备独立像素)测量时,actual 设备像素数会因设备屏幕而异。
您的代码需要对这些差异敏感。进行绘图时,不要假定视图 Canvas 的大小。而是问view有多大,全部按实测尺寸进行绘制。
在进一步阅读 canvas
以及 this post 的帮助后,我解决了这个问题。
问题出在 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);
}
在将剪辑矩形大小替换为图像大小后,一切正常。
我的应用程序有一个功能,可以让用户拍摄照片并在照片上添加绘图。
所有照片的大小都重新调整为 900 x 900
。
允许用户向图像添加绘图。我在 original image
上保留一个 transparent image
并在透明图像上绘图。使用 canvas
.
但是在具有 720 x 480
(高 x 宽)的设备中绘图时。如果我创建一个 900 x 900
透明图像并从 0,0
画一条线到 900,900
,canvas 只画从 0,0
到 480,480
的线。
下面是代码的相应部分:
准备中Canvas:
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
??有什么解决办法吗?非常感谢任何帮助:-)
仅仅因为照片是 900x900,并不意味着它在设备屏幕上显示时就是那么多像素。设备屏幕可以有非常不同的尺寸,当图像(或任何与此相关的视图)被告知扩展其尺寸以适合屏幕,或以 dp(设备独立像素)测量时,actual 设备像素数会因设备屏幕而异。
您的代码需要对这些差异敏感。进行绘图时,不要假定视图 Canvas 的大小。而是问view有多大,全部按实测尺寸进行绘制。
在进一步阅读 canvas
以及 this post 的帮助后,我解决了这个问题。
问题出在 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);
}
在将剪辑矩形大小替换为图像大小后,一切正常。