java - 在 Canvas 中居中 public void onDraw(Canvas canvas) 内的缩放位图

标签 java canvas bitmap android-canvas

我成功缩放了位图。

Rect src = new Rect(0, 0, icon.getWidth() - 1, icon.getHeight() - 1);
Rect dest = new Rect(0,0,Math.round(newWidth), Math.round(newHeight));
canvas.drawBitmap(icon, src, dest, null);

问题是图像出现在 Canvas 的左侧。 我希望它位于 Canvas 的中间。 一个大问题是我担心内存管理。所以我不想预先创建缩放位图,我更愿意使用动态创建和绘制缩放位图的方法:

  canvas.drawBitmap(icon, src, dest, null);

我怎样才能做到这一点?

最佳答案

如果您希望图像在Canvas上居中,很简单,只需计算中心坐标并将其应用到dest即可。

int cx = (getWidth() - newWidth) / 2;
int cy = (getHeight() - newHeight) / 2;

Rect src = new Rect(0, 0, myBitmap.getWidth() - 1, myBitmap.getHeight() - 1);
Rect dest = new Rect(cx, cy, cx+Math.round(newWidth), cy+Math.round(newHeight));
canvas.drawBitmap(myBitmap, src, dest, null);

但是,这不是正确的方法,因为每次调用 onDraw(Canvas) 时都会创建 2 个 Rect。只要 gc 垃圾收集它,它就会保留在内存中。

为了避免这种情况,您可以预先计算 Rect 并存储它们,因为它们不像位图那样占用内存。

关于java - 在 Canvas 中居中 public void onDraw(Canvas canvas) 内的缩放位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42143218/

相关文章:

java - 尝试压缩位图时出现 OutOfMemoryError

java - 博德马斯, java 。简单的数学不会相加

java - Spring java中的ToString和EqualsAndHashCode注解

Javascript + Firebug console.log(),如何不获取异常?

canvas - three.js:如何让多种 Material 为一个网格工作

c - 在 C 中以独立于机器的方式引用堆地址

java - 如何为 Selenium webdriver assert 连接嵌套的 xpath?即连续标签和单独的按钮

java - 用于rollingFileAppender 的log4jappender.setAppend 不起作用?

javascript - Canvas 乒乓球闪闪发光

android - 在android的位图上将白色转换为透明