【问题标题】:Android - Set Drawable to Canvas but keep Aspect RatioAndroid - 将 Drawable 设置为 Canvas 但保持纵横比
【发布时间】:2016-02-15 23:59:31
【问题描述】:

我的 android 代码有一个小问题。这是我第一次使用画布,我想为其设置图像但保持某种类型的纵横比。

这就是我现在正在做的事情,这会将图像完全映射到画布上。它将图像宽高设置为画布宽高。

Drawable drawable = image;  // gets the image

drawable.SetBounds(0, 0, canvasWidth, canvasHeight);

drawable.Draw(canvas);

这在某些设备上效果很好,但是当设备很大时,拉伸效果真的很差。我想以保持纵横比的方式设置边界。如果画布宽高不是相同的纵横比,它会尝试用纵横比填充画布,但可能会在 x 或 y 轴上留下一些空间。

int imgWidth = 500;
int imgHeight = 800;

我想根据这些值在画布上映射图像并根据需要进行拉伸,但即使画布的一部分未填充,也要保持此纵横比。

最好的方法是什么?

谢谢

【问题讨论】:

    标签: android canvas


    【解决方案1】:

    我已经回答了一个类似的问题here

    为了保持纵横比,我这样做了:

    val drawable = resources.getDrawable(R.drawable.my_vector, null)
    val aspectRatio = drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight
    val desiredWidthInPx = 100 // could be your view size or canvas size
    val derivedHeightInPx = (desiredWidthInPx / aspectRatio).toInt()
    drawable.setBounds(0, 0, desiredWidthInPx, derivedHeightInPx)
    drawable.draw(canvas)
    

    以上内容适用于可绘制宽度小于其高度的情况。
    如果drawable的高度大于它的宽度,那么首先将高度设置为你想要的大小,然后计算宽度。

    【讨论】:

      【解决方案2】:

      在每个资源文件夹中提供正确的图像。正确的图像意味着正确的分辨率和屏幕密度。参考这个链接http://developer.android.com/guide/topics/resources/providing-resources.html

      【讨论】: