首先用到的控件是RatingBar,一般都很少用系统原生的,都是给出了自己用的UI星图,所以我们要做一些准备工作的
首先看看异常显示
如果给RatingBar设置固定的高度会导致星星显示不全,或者显示异常,这样子很丑,网上看过很多博客,试过了,各种办法都不太友好
就算在调试的这台手机上显示正常,更换个其他分辨率的手机就会出现显示不全,或者不够撑满控件的大小,所以给出了以下解决方案:获取星星图片的原图大小,然后通过代码进行设置RatingBar的高度
先看看更改具体效果,首先放了两个系统的,一个是自适应高度,一个是指定高度,第三个是自定义背景的RatingBar,具体效果图如下:
具体步骤如下:
首先xml文件中放3个RatingBar<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RatingBar
android:id="@+id/rb1"
android:numStars="5"
android:rating="3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RatingBar
android:id="@+id/rb2"
android:numStars="5"
android:rating="3"
android:layout_width="wrap_content"
android:layout_height="30dp" />
<RatingBar
android:layout_marginTop="20dp"
android:id="@+id/rb3"
style="@style/FiveStarsStyle1"
android:numStars="5"
android:rating="3"
android:layout_width="wrap_content"
android:layout_height="30dp" />
</LinearLayout>
第三个是定义背景的RatingBar,在style文件中定义
<!--五星控件 start-->
<style name="FiveStarsStyle1" parent="@android:style/Widget.Holo.RatingBar.Small">
<item name="android:progressDrawable">@drawable/five_rating_bar</item>
<item name="android:minHeight">40dp</item>
<item name="android:maxHeight">40dp</item>
</style>
<!--五星控件 end-->
星星进度的背景图片也是xml定义的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/stars_gray" />
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/stars_gray" />
<item
android:id="@android:id/progress"
android:drawable="@drawable/stars_bright" />
</layer-list>
两个小图标呢就是自己找的资源了
解决星星图片不能填充控件的关键代码:
package com.example.mytestdemo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.LinearLayout;
import android.widget.RatingBar;
public class StarsActivity extends AppCompatActivity {
RatingBar rb3;
private int starsImgHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stars);
rb3 = (RatingBar) findViewById(R.id.rb3);
//获取图片的高度
try {
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.stars_bright);
starsImgHeight = bmp.getHeight();
} catch (Exception e) {
e.printStackTrace();
}
//将获取的图片高度设置给RatingBar
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)rb3.getLayoutParams();
lp.width = LinearLayout.LayoutParams.WRAP_CONTENT;
lp.height =starsImgHeight;
rb3.setLayoutParams(lp);
}
}
主要还一开始说的思想,获取图片的高度设置给RatingBar,目前就这个解决方案了,如果大家有更好的方案,请给我留言哈,大家一起学习进步