如何使用Path或PathData创建可无损缩放的Drawable对象?
解决方案
问题解答
- 可以使用Path对象创建支持无损缩放的Drawable,VectorDrawable是最佳选择,它基于矢量图形实现,缩放时不会损失画质。
- 完全可以用PathData创建Drawable,VectorDrawable原生支持解析PathData,并且能保持矢量特性。
替代BitmapDrawable的实现代码
你当前用BitmapDrawable的方案会因为位图的像素特性导致缩放失真,改用VectorDrawableCompat(兼容Android各版本)来动态创建矢量Drawable就能解决问题:
import android.graphics.Color import android.graphics.Path import android.graphics.drawable.VectorDrawableCompat import android.util.PathParser import android.content.Context fun createCheckmarkVectorDrawable(context: Context, color: Int): VectorDrawableCompat { val pathStr = "M6,11 l3.5,4 l8,-7" val path = PathParser.createPathFromPathData(pathStr) val vectorDrawable = VectorDrawableCompat.create(context.resources, null, context.theme) vectorDrawable?.run { // 设置Drawable的固有宽高(矢量缩放不依赖该固定值,仅作为默认参考) setIntrinsicWidth(24) setIntrinsicHeight(24) // 配置路径属性 val pathInfo = VectorDrawableCompat.PathInfo().apply { this.path = path this.fillColor = color this.strokeWidth = 2f // 可按需调整描边宽度 this.strokeColor = color // 不需要描边可删除该行 } setPaths(mutableListOf(pathInfo)) } return vectorDrawable ?: VectorDrawableCompat() }
代码说明
VectorDrawableCompat是官方兼容类,支持Android 4.0及以上版本使用矢量Drawable。- 矢量Drawable基于数学路径描述图形,无论缩放多少倍都不会出现锯齿或模糊,彻底解决缩放画质下降的问题。
- 可根据需求调整填充色、描边宽度等属性,固有宽高仅作为默认尺寸参考,实际显示大小会适配布局约束。
备选方案:XML定义VectorDrawable
如果不需要动态创建,也可以直接在res/drawable目录下创建XML文件,用PathData定义矢量图形:
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#FF000000" android:pathData="M6,11 l3.5,4 l8,-7"/> </vector>
代码中直接引用该Drawable即可,同样支持无损缩放。
内容的提问来源于stack exchange,提问作者Riz1Ahmed
相关产品推荐
相关产品推荐

