gpt4 book ai didi

android - Gingerbread 设备上的自定义评分栏

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:25 26 4
gpt4 key购买 nike

我创建了一个自定义的 RatingBar,它可以有 5 种不同的颜色,并且有矩形条,点在星形下方。这是它的样子:

enter image description here

我在几个地方使用这个 View ,在 Android 4.0+ 上一切正常。但是在 Gingerbread 上我有一些问题。这是 View 类的代码:

public class KrinsenRating extends RelativeLayout {

private TextView mRanking;
private RatingBar mStars;

public KrinsenRating(Context context, AttributeSet attrs) {
super(context, attrs);

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.krinsen_rating, this);

loadViews();
}

public KrinsenRating(Context context) {
super(context);

loadViews();
}

private void loadViews() {
mRanking = (TextView) findViewById(R.id.ranking_bar_position);
mStars = (RatingBar) findViewById(R.id.ranking_bar);
}

public void setRating(long rating){
RatingConverter rc = new RatingConverter(rating);

Bitmap bmp_empty = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_empty)).getBitmap();
Bitmap bmp_half = null;
Bitmap bmp_full = null;

switch (rc.getColor()) {
case 1:
bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half1)).getBitmap();
bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full1)).getBitmap();

mRanking.setBackgroundColor(getResources().getColor(R.color.ranking1));
break;
case 2:
bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half2)).getBitmap();
bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full2)).getBitmap();

mRanking.setBackgroundColor(getResources().getColor(R.color.ranking2));
break;
case 3:
bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half3)).getBitmap();
bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full3)).getBitmap();

mRanking.setBackgroundColor(getResources().getColor(R.color.ranking3));
break;
case 4:
bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half4)).getBitmap();
bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full4)).getBitmap();

mRanking.setBackgroundColor(getResources().getColor(R.color.ranking4));
break;
case 5:
bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half5)).getBitmap();
bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full5)).getBitmap();

mRanking.setBackgroundColor(getResources().getColor(R.color.ranking5));
break;
}

mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full}));
mStars.setRating(rc.getRealRating());
mRanking.setText(rating + "");
}
}

这一行令人困惑:mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); 但我不得不这样做,因为渲染星星时出现问题在 setProgressDrawable() 调用之后(只显示一个拉伸(stretch)的星形)。这是方法 buildRatingBarDrawables:

public static 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;
}

因此,在 Android ICS 和更新版本上一切正常,但在 Gingerbread 上我遇到了一些奇怪的情况。首先,有时在 Gingerbread 上一切都很好。但往往是根本没有星星。带点的矩形条总是正确的,但星星有时会消失。这是来自 ListView 的示例屏幕,它在每一行中使用评级栏:

enter image description here

如您所见,有时可以,有时不能:/我的导航 slidingMenu 上有这个评级栏,当我慢慢滑动时会显示星星,但在滑动结束后(应该调用 onOpened 时)星星就这样消失了。

你有什么让我更开心的想法吗?:)

我为评级布局添加了 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/avatar_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center" >

<RatingBar
android:id="@+id/ranking_bar"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerHorizontal="true"
android:clickable="false"
android:focusable="false"
android:isIndicator="true"
android:numStars="3"
android:progressDrawable="@drawable/krinsen_rating"
android:stepSize="0.1" />

<TextView
android:id="@+id/ranking_bar_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ranking_bar"
android:layout_centerHorizontal="true"
android:contentDescription="@string/register_avatar"
android:paddingBottom="2dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="2dp"
android:textColor="@android:color/white"
android:textSize="14sp"
android:textStyle="bold" />
</RelativeLayout>

最佳答案

将您的评级可绘制对象定义到图层列表可绘制对象中,然后将其分配给您的 RatingBar 类会是一种更简单的方法。它适用于 android Gingerbread 和之前的版本。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background"
android:drawable="@drawable/star_empty" />
<item android:id="@+android:id/secondaryProgress"
android:drawable="@drawable/star_empty" />
<item android:id="@+android:id/progress"
android:drawable="@drawable/star_full" />
</layer-list>

将其保存到 drawables 文件夹中的 xml 文件中,例如 myCustomRatingBarDrawable.xml

然后在任何 RatingBar View 上:

<RatingBar
android:id="@+id/ratingbar"
android:progressDrawable="@drawable/myCustomRatingBarDrawable"
android:isIndicator="true"
android:max="5"
android:numStars="5"
...
/>

关于android - Gingerbread 设备上的自定义评分栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18528346/

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