gpt4 book ai didi

android - 使用从网络加载的图像构建 RatingBar

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:03:57 26 4
gpt4 key购买 nike

我有一个表单,它是根据从 Web 服务接收到的数据动态生成的。此 Web 服务提供创建输入元素时需要使用的图像。我很难设置 RatingBarprogressDrawable。虽然 XML 我能够使用以下作为 progressDrawable 应用自定义图像:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background" android:drawable="@drawable/custom_star" />
<item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/custom_star" />
<item android:id="@+android:id/progress" android:drawable="@drawable/custom_star" />
</layer-list>

其中 custom_star 是一个简单的 .png 图像,并使用 @android:style/Widget.RatingBar 作为 RatingBar 样式。这很好用:

Working start

但我想动态更改 custom_star

在代码中,我尝试直接使用位图设置可绘制进度:

Drawable d = new BitmapDrawable(getResources(), downloadedImage);
ratingBar.setProgressDrawable(d);

并且还通过构造一个layer-list:

LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {
getResources().getDrawable(R.drawable.custom_star),
getResources().getDrawable(R.drawable.custom_star),
getResources().getDrawable(R.drawable.custom_star)
});

layerDrawable.setId(0, android.R.id.background);
layerDrawable.setId(1, android.R.id.secondaryProgress);
layerDrawable.setId(2, android.R.id.progress);

ratingBar.setProgressDrawable(layerDrawable);

都不适合我;两者都会导致 custom_star 可绘制对象出现一次,由 RatingBar 的尺寸拉伸(stretch):

enter image description here

有什么想法吗?

更新:

Luksprog 在下面的回答有所改进,但我仍然遇到一些问题。现在,star drawable 没有被拉伸(stretch)并且可以通过触摸设置值,但是它显示为选中 3/5:

no secondary

并选择了 5/5:

too many stars

我相信图像的缩放比例可以通过一些调整来修复,但令人讨厌的是 secondaryProgress 可绘制对象似乎没有设置 - 用于未选择的灰色星星的可绘制对象。没有它,它不是很有用。

最佳答案

Any ideas?

当使用默认的 progressDrawable 或通过主题设置的 progressDrawable 时,一切都会正常,因为在 RatingBar(它的父类(super class))的构造函数中ProgressBar 更准确地说)小部件一个方法将被调用以从该可绘制对象“制作瓷砖”。当使用 setProgressDrawable 方法时,这不会发生,如果您传递一个简单的 BitmapDrawable 或一个 LayerDrawable(使用简单的 BitmapDrawables) Drawable 将被简单地拉伸(stretch)以覆盖小部件的背景区域(你所见即所得)。

为了使其正常工作,您需要手动执行 RatingBar 开始时执行的操作,创建图 block 及其使用的 ClipDrawables。我已经为此编写了一个方法,遵循 ProgressBar 小部件的源代码:

private Drawable buildRatingBarDrawables(Bitmap[] images) {
final int[] requiredIds = { android.R.id.background,
android.R.id.secondaryProgress, android.R.id.progress };
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
Drawable[] pieces = new Drawable[3];
for (int i = 0; i < 3; i++) {
ShapeDrawable sd = new ShapeDrawable(new RoundRectShape(
roundedCorners, null, null));
BitmapShader bitmapShader = new BitmapShader(images[i],
Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
sd.getPaint().setShader(bitmapShader);
ClipDrawable cd = new ClipDrawable(sd, Gravity.LEFT,
ClipDrawable.HORIZONTAL);
if (i == 0) {
pieces[i] = sd;
} else {
pieces[i] = cd;
}
}
LayerDrawable ld = new LayerDrawable(pieces);
for (int i = 0; i < 3; i++) {
ld.setId(i, requiredIds[i]);
}
return ld;
}

然后您将使用此方法返回的 LayerDrawablesetProgressDrawable 方法。 RatingBar 将其宽度设置为其中一个状态位图的宽度乘以星星的数量,因此为了显示正确数量的星星,还必须对其进行计算。

关于android - 使用从网络加载的图像构建 RatingBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027475/

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