【问题标题】:How to scale thickness or strokeWidth of line when screen size changes屏幕尺寸变化时如何缩放线条的粗细或描边宽度
【发布时间】:2017-08-12 16:15:07
【问题描述】:

我正在玩一个在画布上绘制和跟踪用户手指的应用程序。看到这个picture,绿色矩形是通过跟踪用户的手指运动来绘制的。我从 android SDK 示例中获取了旧版 FingerPaint 应用程序的大部分代码。它的要点是在画布上绘制路径:

    canvas.drawPath (path, paint)

我的第一个挑战是在屏幕变化时正确重绘路径。例如,当手机从垂直旋转到水平时,图像会调整大小,我必须沿着正确的坐标重新绘制路径。我能够使用transform 正确地做到这一点。我使用 path.transform(matrix) 来转换路径的坐标。

我现在的下一个挑战是正确缩放线条的粗细。当我绘制路径时,线的粗细是用 setStrokeWidth 设置的。比如我把粗细设置为12:

    paint.setStrokeWidth(12);

我不知道如何在屏幕变化时正确缩放线条的粗细。有人知道怎么做吗?

建议首先将画布和路径保存为位图,然后在新的屏幕尺寸上重新绘制位图。但我不想这样做,因为我想支持撤消/重做操作,用户可以撤消/重做在画布上跟踪的路径。

【问题讨论】:

  • 您是否使用自定义 ImageView 并覆盖 onDraw 方法?或者在您的自定义View 中自己绘制您的Bitmap
  • 我在自己的自定义视图上自己绘制位图
  • 使用Canvas#drawBitmap(Bitmap, Matrix, Paint) 可能吗?或者你使用Canvas#scale / Canvas#concat?
  • 我有自己的自定义视图。在我的自定义视图的onDraw(canvas) 方法中,我做了两件事。首先canvas.drawBitmap(...)画图。其次,canvas.drawPath(path, paint) 绘制用户用手指绘制的路径。在屏幕旋转时,onDraw(canvas) 被调用以重新绘制我的视图,因为屏幕尺寸已更改。那时,我能够成功转换路径的坐标,以便canvas.drawPath(path, paint) 将路径呈现在正确的位置。但我还不知道如何正确缩放路径的厚度。
  • 是的,我知道,我的问题是如何缩放位图以适应屏幕旋转后的新尺寸?

标签: android canvas


【解决方案1】:

你可以这样使用:

float screenWidthPixel  = this.getResources().getDisplayMetrics().widthPixels;
float screenHeightPixel = this.getResources().getDisplayMetrics().heightPixels;

float STROKE_WIDTH = screenWidthPixel * 0.0035f;
float Y_POSITION   = screenHeightPixel * 0.01f;

paint.setStrokeWidth(STROKE_WIDTH);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2013-04-22
    • 1970-01-01
    • 2016-07-02
    • 2016-07-02
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多