java - 如何使用java以编程方式更改矢量drawable的大小
问题描述
我想更改在我的回收站视图中显示的图标的大小。我的回收商视图基本上显示了费用类别。我已经在使用 android studio 创建的 XML 布局中用图标硬编码了一些类别,但用户也可以定义自己的类别并为此选择一个图标,我使用的是https://github.com/马耳他/icondialoglib/wiki 对话框允许用户在定义新类别时选择他们选择的图标。我将对话框中的可绘制图标的 ID 保存到数据库中,并在适配器类的 onBindViewHolder 方法中检索 ID 并使用该 ID 获取图标。如果我显示在 XML 中定义的矢量可绘制对象,则图标的大小(48x48)显示完美,但从对话框中选择的图标的大小更小(图片在下面共享)。我试图将其更改为 48x48,但它不起作用。
<ImageView
android:id="@+id/single_column_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
></ImageView>
在 XML 中定义的矢量可绘制对象。
<vector android:autoMirrored="true" android:height="48dp"
android:viewportHeight="32" android:viewportWidth="32"
android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#333332" android:pathData="M24.832,11.445C24.646,11.167 24.334,11 24,11h-1c-0.553,0 -1,0.447 -1,1v6c0,0.553 0.447,1 1,1h4c0.553,0 1,-0.447 1,-1v-1.5c0,-0.197 -0.059,-0.391 -0.168,-0.555L24.832,11.445zM27,18h-4v-6h1l3,4.5V18z"/>
<path android:fillColor="#333332" android:pathData="M31.496,15.336l-4,-6C26.938,8.499 26.004,8 25,8h-4V6c0,-1.654 -1.346,-3 -3,-3H3C1.346,3 0,4.346 0,6v11c0,1.654 1.346,3 3,3h0v3c0,1.654 1.346,3 3,3h1.142c0.447,1.721 2,3 3.859,3c1.857,0 3.41,-1.279 3.857,-3h5.282c0.447,1.721 2,3 3.859,3c1.857,0 3.41,-1.279 3.857,-3H29c1.654,0 3,-1.346 3,-3v-6C32,16.406 31.826,15.83 31.496,15.336zM3,18c-0.552,0 -1,-0.447 -1,-1V6c0,-0.553 0.448,-1 1,-1h15c0.553,0 1,0.447 1,1v2v2v7c0,0.553 -0.447,1 -1,1H3zM11.001,27c-1.105,0 -2,-0.896 -2,-2s0.895,-2 2,-2c1.104,0 2,0.896 2,2S12.104,27 11.001,27zM24,27c-1.105,0 -2,-0.896 -2,-2s0.895,-2 2,-2c1.104,0 2,0.896 2,2S25.104,27 24,27zM30,23c0,0.553 -0.447,1 -1,1h-1.143c-0.447,-1.721 -2,-3 -3.857,-3c-1.859,0 -3.412,1.279 -3.859,3h-5.282c-0.447,-1.721 -2,-3 -3.857,-3c-1.859,0 -3.412,1.279 -3.859,3H6c-0.552,0 -1,-0.447 -1,-1v-3h13c1.654,0 3,-1.346 3,-3v-7h4c0.334,0 0.646,0.167 0.832,0.445l4,6C29.941,16.609 30,16.803 30,17V23z"/>
</vector>
Java 代码
@Override
public void onBindViewHolder(@NonNull CategoryViewHolder holder, int position) {
String categoryName=addCategoriesList.get(position).getColumn_value();
holder.textView.setText(categoryName);
if(categoryName.equals("Transport")){
holder.imageView.setImageResource(R.drawable.ic_transport);
}else{
if(IconHelper.getInstance(holder.imageView.getContext()).getIcon(addCategoriesList.get(position).getIconID())!=null){
Drawable drawable=IconHelper.getInstance(holder.imageView.getContext()).getIcon(addCategoriesList.get(position).getIconID()).getDrawable(holder.imageView.getContext());
drawable.setBounds(0,0,100,100);
holder.imageView.setImageDrawable(drawable);
}}
}
解决方案
这条线看起来可能是罪魁祸首:
drawable.setBounds(0,0,100,100);
这些是像素值,因此它们会导致图标以不同的物理尺寸出现,具体取决于您用于测试的设备的像素密度。如果你的设备是 xxxhdpi,100px 会比 48dp 小很多。
您可以将 px 转换为 dp 以便在此处使用正确的值,但我认为您可以更简单。一旦您知道您使用的是用户选择的图像,您实际上就不必构建Drawable
对象。相反,您可以直接使用资源值:
int iconId = addCategoriesList.get(position).getIconID();
holder.imageView.setImageResource(iconId);
推荐阅读
- react-native - 我想用 React Native 中的按钮移动屏幕
- python - 此错误中的 NavigableString 指的是什么,为什么会这样?
- javascript - 打开多个标签时如何隐藏推送通知 FCM?
- python - 如何在 tkinter 中添加图像
- flutter - 错误:未为类“对象”定义运算符“[]”
- java - SQLException:查询不返回结果
- json - 将具有 JSON 字段的选择结果转换为 JSON,并将该数据与 JSON_VALUE() 一起使用
- unity3d - 具有 MRTK 2.6.1 的 Hololens2 在设备睡眠后失去头部姿势
- python - 如何从我的 main.py 调用导航布局中的函数
- dax - 在 Power BI 中使用 DAX 计算运行平均值 - 逐行