- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个表单,它是根据从 Web 服务接收到的数据动态生成的。此 Web 服务提供创建输入元素时需要使用的图像。我很难设置 RatingBar
的 progressDrawable
。虽然 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 样式。这很好用:
但我想动态更改 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):
有什么想法吗?
更新:
Luksprog 在下面的回答有所改进,但我仍然遇到一些问题。现在,star drawable 没有被拉伸(stretch)并且可以通过触摸设置值,但是它显示为选中 3/5:
并选择了 5/5:
我相信图像的缩放比例可以通过一些调整来修复,但令人讨厌的是 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;
}
然后您将使用此方法返回的 LayerDrawable
和 setProgressDrawable
方法。 RatingBar
将其宽度设置为其中一个状态位图的宽度乘以星星的数量,因此为了显示正确数量的星星,还必须对其进行计算。
关于android - 使用从网络加载的图像构建 RatingBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027475/
每当我在布局中使用 RatingBar View 时,我都会突然遇到各种编译错误。我使用的是 Android 2.0,但我也尝试过 2.0.1 和 2.1,但并不愉快。我还收到一条消息:Shader
我在应用程序中有一个 RatingBar 组件,我对其进行了以下配置: android:numStars="5" android:stepSize="1.0" 问题是一旦触摸从下一个星星的部分穿过一个
我有一个 layout我想在哪里显示RatingBar为用户。我正在使用我自己的自定义图标而不是默认星星。我的问题是图标是矢量格式,当我使用它们时,我会得到奇怪的效果(见下图)。它应该显示 5 个图标
我已将 RatingBar 添加到我的 ListView 的每个项目中。它运行良好,但不显示准确评级。例如,如果评级是 4.3,它必须显示第 5 颗星的一部分,但它没有。 截图: 第一项评分 = 4.
我在 ListView 中有一个 TextView 和 RatingBar,我想在每个上保存 RatingBar 的值在 ListView 中列出,可以使用自定义适配器吗?? 我用来做的代码喜欢: P
我有一个 RatingBar,用户可以在其中提交星级。我没有按钮,我想让它对用户更友好,让它动态提交。 在 setOnRatingBarChangeListener 方法中,我提交了星星。 这里是问题
我真的是 android 编程的新手。我的问题是 RatingBar 实际上是如何工作的?我想制作一个包含 RatingBars 的应用程序,每当用户将它评为 4 星时,我希望我的应用程序的其他用户也
我正在开发一个使用 RatingBar 的 Android 应用程序,并获得 5 颗星。我有一台 HTC Wildfire,RatingBar 工作得很好。我有这个屏幕的布局。但是,我在 HTC de
我的应用程序中有一个 android 评级栏,它只显示 int 评级。 例如: float ratingValue = 1.5f; myRatingBar.setRating(ratingValue)
RatingBar 中的步长是多少?这是我在文档中找到的内容:此评级栏的步长。例如,如果需要半星粒度,则为 0.5。我试图在这里找到它:https://developer.android.com/re
我知道我可以应用我自己的风格,将评分栏的明星图片换成其他东西。我需要一些更复杂的东西:每个 ratingbar 元素都应该比以前的大。 看图: 这可能吗? 最佳答案 我们可以扩展评分栏,保持栏的高度与
背景:我们使用标准的 Android RatingBar 5 星。我们允许用户使用此 RatingBar 从 1 到 5 进行评分。我们显示的默认值为零,即未评分。 问题:用户目前即使在点击评级栏一次
我知道这听起来很烦人,但有时感觉 Android 的 UI 组件和行为有些离谱。 考虑以下 XML: 在不同尺寸的设备上显示效果的屏幕截图: Nexus S 评分栏 平板电脑评分栏 小型
我需要强制 重绘 RatingBar 控件。 在评级栏和样式出现许多问题后,我设法使几乎所有功能都正常工作。 我在 ListView 项目中使用它。由于它的工作原理,人们不得不对其外观和行为进行一些“
我有以下 RatingBar: 当我按下星星的左边部分时 - 它被选中,但当我按下右边部分时 - 下一颗星星被选中。我需要我点击的星星被选中,无论我点击它的哪个部分。请帮助我了解问题所在。 最佳答案
我在应用程序中有这个评分栏,它始终正确显示。但最近我意识到它在某些设备上无法正常工作(包括带有 Lollipop 版本的 Nexus 5)。 评级栏被黑色覆盖层覆盖,如下图所示(仅在某些设备上)。当
如何做到以下几点? 如果 RatingBar 有 1-3 颗星 - 红星。如果 RatingBar 有 4 颗星 - 黄色星星。如果 RatingBar 有 5 颗星 - 绿星。 ((RatingBa
我有一个表单,它是根据从 Web 服务接收到的数据动态生成的。此 Web 服务提供创建输入元素时需要使用的图像。我很难设置 RatingBar 的 progressDrawable。虽然 XML 我能
我在每行中使用 RecyclerView 和 RatingBar。现在,有时部分 RatingBar 绘制不正确。离开屏幕并返回后,一切恢复正常。我不知道为什么会这样,我什至从 RatingBar 中
我正在尝试在 ListView 中显示评级栏。 无论我尝试了什么: viewHolder.viewOnlyQuickRatingBar.setNumStars(5); 或: android:n
我是一名优秀的程序员,十分优秀!