具体的使用我就不介绍了,CSDN有很多博客都介绍到了。在使用自定义的图片时,需要用到一个style文件,如下:
<resources>
<style name="myRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/my_rating_bar</item>
<item name="android:minHeight">16dip</item>
<item name="android:maxHeight">16dip</item>
</style>
</resources>
如果需要适配多分辨率多屏幕密度的情况下,android:minHeight 和 android:maxHeight这两个属性不管设置多大都不合适。一种屏幕合适了,在另外一个屏幕上,就可能显示不完整或者图片被拉伸。解决的方法如下:
step 1:将这两张图片分别拷贝到以下文件夹;
setp 2:修改android:minHeight 和 android:maxHeight 这两个属性的值为图片的实际高度,用px为单位。假设图片的尺寸为 36x30,修改后如下:
<resources>
<style name="roomRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/room_rating_bar</item>
<item name="android:minHeight">30px</item>
<item name="android:maxHeight">30px</item>
</style>
</resources>
修改完毕,在不同分辨率的手机下,都能正常显示。
注意:有的同学在替换图片后会发现,星星之间的挨的太近,没有间距。这个时候可以在切图的时候,在星星图片的左右两边都加上几个像素的透明边距。
-------------------------------------
1.xml布局解决。
2.代码解决。
3.将RatingBar换成ImageView,一劳永逸。
第一种方式:
能解决正规分辨率下的适配,但是Android机型真是不敢恭维,太NM恶心了。
做适配:
1.分别在drawable目录下放置对应的图片
2.写个样式
<style name="myRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/ratingbar_drawable</item>
<item name="android:minHeight">@dimen/rating_bar_my_height</item>
<item name="android:maxHeight">@dimen/rating_bar_my_height</item>
</style>
不同dpi目录下 dimen设置的height应该对应相应的图片px
这是我的RatingBar的drawable
<?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/star2_gray">
</item>
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/star2_gray">
</item>
<item
android:id="@android:id/progress"
android:drawable="@drawable/star2_pink">
</item>
</layer-list>
第二种方式:
直接获取对应图片的高度,然后设置图片的高度。
try {
Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_score_press);
scroeHeight = bmp.getHeight();
} catch (Exception e) {
e.printStackTrace();
}
在需要的地方设置LayoutParams 记得图片只需要初始化一次就可以了。
if(scroeHeight!=0){
LinearLayout.LayoutParams llp = (LayoutParams) holder.rb_score.getLayoutParams();
llp.width = -2;// 包裹内容
llp.height = scroeHeight;
holder.rb_score.setLayoutParams(llp);
}