gpt4 book ai didi

android - 如何使用不受缩放或缩放影响的 Canvas 在 ImageView 上绘制线条?

转载 作者:行者123 更新时间:2023-12-04 04:30:53 38 4
gpt4 key购买 nike

我通过执行以下操作在 ImageView 上画线:

    Bitmap imageBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
Bitmap duplicateBitmap = Bitmap.createBitmap(imageBitmap.getWidth(),imageBitmap.getHeight(),Bitmap.Config.RGB_565);

Canvas targetCanvas = new Canvas(duplicateBitmap);
targetCanvas.drawBitmap(imageBitmap,0,0,null);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(3f);
targetCanvas.drawLine(0f,100f, imageBitmap.getWidth(),100f,paint);
imageView.setImageDrawable(new BitmapDrawable(getResources(),duplicateBitmap));
不放大的时候看起来还不错。
但是当我放大时,线条变粗了。 (这是预期的行为)
现在,如何在 ImageView 上绘制线条,以便用户放大线条的粗细时不受影响?
P.S:我先尝试“放大”图像,然后在图像上画线。 (点击按钮或其他东西)。但这没有用,线仍然很粗。
我还发现,当图像分辨率较低时,绘制的线条会更粗。所以我假设在图像上绘图也与图像分辨率有关。
我正在考虑用高分辨率 Canvas 掩盖 ImageView,但这会导致内存效率低下。另外,我对如何实际实现这一点一无所知。
我不知何故相信 this question 的答案可以解决我的问题。

最佳答案

正确的方法是使用 View Canvas 动态渲染线条,而不是位图本身。
您的实现失败的原因是,如果您将网格直接渲染到位图中,那么您实际上是在更改位图像素,因此从逻辑上讲,如果您缩放位图,那么网格像素也会缩放,如 所有位图+网格都变成了同一张图片 .
一种解决方案是使用任何现成的缩放 ImageView 小部件。您会在 GitHub 中找到很多内容,例如:
ZoomImageView
然后您有 2 个选项,扩展小部件以创建您自己的子类,或直接在小部件代码中执行实现。你决定。
在这两种情况下,您需要做的是覆盖它的 绘制 回调,并在 之后立即执行网格绘制super.onDraw( Canvas ) 称呼。
无需创建新的位图或新的 Canvas 实例。使用方法的 Canvas 来执行绘图。

@Override
protected void onDraw(final Canvas canvas) {

super.onDraw(canvas);

// Render the grid

final int slotWidth = this.getWidth() / 3;
final int slotHeight = this.getHeight() / 3;

this.paint.setColor(this.gridColor);

// Horizontal lines
canvas.drawLine(0, slotHeight, this.getWidth(), slotHeight, this.paint);
canvas.drawLine(0, (slotHeight * 2), this.getWidth(), (slotHeight * 2), this.paint);

// Vertical lines
canvas.drawLine(slotWidth, 0, slotWidth, this.getHeight(), this.paint);
canvas.drawLine((slotWidth * 2), 0, (slotWidth * 2), this.getHeight(), this.paint);
}
附带说明,避免在 onDraw 方法中创建新对象,例如 Paint 实例等,因为 onDraw 可以在短时间内调用多次。无论如何,Lint 都应该警告你。永远不要在 onDraw、onMeasure 等方法中创建新的对象实例,因为这样的场景总是预先缓存/重用它们。
更简单的替代方案 ,是扩展一个 View 并创建一个新的专用 GridView 小部件,与实际的 Zoom Image View 无关。执行相同的操作,因此也覆盖 绘制 方法如上例,并渲染网格如图所示。然后将这个新 View 放入您的布局设计中,正好在您的缩放 ImageView 控件之上,确保两个控件具有相同的指标。

关于android - 如何使用不受缩放或缩放影响的 Canvas 在 ImageView 上绘制线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64024253/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com