53.星级评分条

【实际效果图】


1.相关资源:

/** * 自定义View的几个重要方法步骤: * 1、构造方法 创建 对象:据使用的那种方式调用那种方法 * 2、获取View的大小 :onMeasure(int,int) * 3、确定View的位置,view自身有一定的权力,但是决定权在父布局上 : onLayout(); * 4、绘制View的内容:onDraw(Canvas) *///自定义控件---星级评分条(只用于显示,不可拖动)public class MyRatingBar extends View {    private Paint paint;//画笔

private float rateNum;//当前星级值(0~5)    private int stepSizeType;//步长类型    private Bitmap starYesBitmap;//满星图片    private Bitmap starNoBitmap;//无星图片    private Bitmap starHalfBitmap;//半星图片

//此处的final整数值应该与attr里面的属性枚举值保持一致    public final static int halfStar = 0;//有半星    public final static int fullStar = 1;//无半星

/**     * 在布局文件中使用自定义的view时,调用此构造方法     */    public MyRatingBar(Context context, AttributeSet attrs) {        super(context, attrs);        //获取自定义属性        TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.MyRatingBar);//获取属性命名空间        rateNum = typeArray.getFloat(R.styleable.MyRatingBar_rateNum, 0);//获取属性值-星级值        stepSizeType = typeArray.getInt(R.styleable.MyRatingBar_stepSizeType, 0);//获取属性值-步长类型

int starYesID = typeArray.getResourceId(R.styleable.MyRatingBar_star_yes, R.drawable.star_yes);        int starNoID = typeArray.getResourceId(R.styleable.MyRatingBar_star_no, R.drawable.star_no);        int starHalfID = typeArray.getResourceId(R.styleable.MyRatingBar_star_half, R.drawable.star_half);        starYesBitmap = BitmapFactory.decodeResource(getResources(), starYesID);        starNoBitmap = BitmapFactory.decodeResource(getResources(), starNoID);        starHalfBitmap = BitmapFactory.decodeResource(getResources(), starHalfID);

initView();    }

/**     * 初始化视图数据     */    private void initView() {        paint = new Paint();        paint.setAntiAlias(true);//设置抗锯齿

//自定义属性若想属性生效,必须刷新状态        flushState();    }

/**     * 测量View的大小     */    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        setMeasuredDimension(starNoBitmap.getWidth() * 5, starNoBitmap.getHeight() * 1);    }

/**     * 确定View的位置     */    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        //自定义view的时候,一般来说作用不大,故此处不做任何处理        super.onLayout(changed, left, top, right, bottom);    }

/**     * 绘制View的内容     */    @Override    protected void onDraw(Canvas canvas) {        int starWidth = starNoBitmap.getWidth();        //无半星        if (stepSizeType == 1) {            int index = (int) (rateNum / 1);            for (int i = 0; i < 5; i++) {                if (i < index) {                    canvas.drawBitmap(starYesBitmap, starWidth * i, 0, paint);//设置第i颗星为满星                } else {                    canvas.drawBitmap(starNoBitmap, starWidth * i, 0, paint);//设置第i颗星为无星                }            }        }        //有半星        else if (stepSizeType == 0) {            int index = (int) (rateNum / 0.5);            for (int i = 0; i < 5; i++) {                if (i * 2 < index) {                    if (i * 2 <= (index - 2)) {                        canvas.drawBitmap(starYesBitmap, starWidth * i, 0, paint);//设置第i颗星为满星                    } else {                        canvas.drawBitmap(starHalfBitmap, starWidth * i, 0, paint);//设置第i颗星为半星                    }                } else {                    canvas.drawBitmap(starNoBitmap, starWidth * i, 0, paint);//设置第i颗星为无星                }

}

}

}

/**     * 监听手势事件     *     * @param event     * @return     */    @Override    public boolean onTouchEvent(MotionEvent event) {        return super.onTouchEvent(event);    }

/**     * 刷新View的状态     */    private void flushState() {        //刷新View,因本例子比较简单,所以flushState()没啥用,只是跳到了flushView()而已,不过复杂点的控件的话,还是将刷新状态和刷新视图分开比较好        flushView();    }

/**     * 刷新View的内容     */    private void flushView() {        //刷新界面,会重新调用onDraw()方法,不在UI线程中刷新界面得使用postInvalidate().        invalidate();    }

public void setRateNum(float rateNum) {        this.rateNum = rateNum;        flushState();    }

public void setStepSizeType(int stepSizeType) {        this.stepSizeType = stepSizeType;        flushState();    }

public void setStarYesBitmap(Bitmap starYesBitmap) {        this.starYesBitmap = starYesBitmap;        flushState();    }

public void setStarNoBitmap(Bitmap starNoBitmap) {        this.starNoBitmap = starNoBitmap;        flushState();    }

public void setStarHalfBitmap(Bitmap starHalfBitmap) {        this.starHalfBitmap = starHalfBitmap;        flushState();    }}

自定义属性:


<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="MyRatingBar">        <attr name="rateNum" format="float"/>        <attr name="stepSizeType" >            <enum name="halfStar" value="0" />            <enum name="fullStar" value="1" />        </attr>        <attr name="star_yes" format="reference"/>        <attr name="star_no" format="reference"/>        <attr name="star_half" format="reference"/>    </declare-styleable>

</resources>

图片资源


2.使用说明:

属性说明:

在XML中设置属性:

在Java中设置属性:

来自为知笔记(Wiz)

时间: 2025-01-13 11:31:07

53.星级评分条的相关文章

更改星级评分条 RatingBar 的样式

1.首先在布局中引用星级评分条: <RatingBar            android:id="@+id/room_ratingbar"            style="@style/roomRatingBar"            android:layout_width="wrap_content"            android:layout_height="fill_parent" />

Android 学习笔记(6)—— SeekBar(进度条)/RatingBar(星级评分条)

作者:夏至  欢迎转载,也请保留这段申明,谢谢 1.SeekBar(进度条) SeekBar即所谓的进度条啦,大家应该对它都不陌生,我们的音乐播放器中的音量调节和视频播放时的进度条都是用它来显示的,这里我们简单的应用这个Demo实现上诉的内容.先来看个效果图和API中的关系图 可以看到第二个继承关系图中,seekbar是属于progressbar的子类,那我们上一节progressbar中的属性,这里都是可以调用的. Ok,这里我们先来写布局程序 <TextView     android:id

Android 自学之星级评分条RatingBar

星级评分条(RatingBar)与拖动条十分相似,他们还有共同的父类AbsSeekBar.实际上星级评分条和拖动条的用法和功能都十分的接近:他们都允许用户通过拖动来改变进度.RatingBar与SeekBar的最大区别在于:RatingBar是通过星星来表示进度. 为了让程序能响应星级评分条评分的改变,程序可以考虑为它绑定一个OnRatingBarChangeListener监听器. 星级评分条支持的常见的XML属性. XMl属性 说明 android:isIndicator 设置该星级评分条是

Android基础入门教程——2.3.9 RatingBar(星级评分条)

Android基础入门教程--2.3.9 RatingBar(星级评分条) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的SeekBar是不是很轻松咧,本节我们学的这个RatingBar(星级评分条)也非常简单,相信在某宝, 买过东西的对这个应该不陌生,收到卖家的包裹,里面很多时候会有个小纸片,五星好评返还多少元这样, 而评分的时候就可以用到我们这个星级评分条了~先来瞅瞅官方文档 官方文档:RatingBar 我们可以看到,这玩意和SeekBar的类结构是一样的,也是Pro

RatingBar(星级评分条)

本节引言: 上一节的SeekBar是不是很轻松咧,本节我们学的这个RatingBar(星级评分条)也非常简单,相信在某宝, 买过东西的对这个应该不陌生,收到卖家的包裹,里面很多时候会有个小纸片,五星好评返还多少元这样, 而评分的时候就可以用到我们这个星级评分条了~先来瞅瞅官方文档 官方文档:RatingBar 我们可以看到,这玩意和SeekBar的类结构是一样的,也是ProgressBar的子类: 也就是说他同样有用ProgressBar的相关属性,接下来我们来探究RatingBar特有的属性!

2.4.6 星级评分条

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layoutMain" android:layout_width="match_parent" android:layout_height="

Android 关于RatingBar评分条

RatingBar评分条系统UI控件 main.xml文件写: <RatingBar        android:id="@+id/ratingbar"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dip"       

android评分条RatingBar自定义设置

RatingBar为评分条控件,默认效果为若干个绿色的星星,如果想将其换成其他自定义图片就要自定义它的style.首先是布局文件: 1 <RatingBar android:id="@+id/app_ratingbar" style="@style/MyRatingBar" 2 android:layout_marginTop="4dip" android:layout_width="wrap_content" 3 an

关于安卓开发实现拖动条和星级评论

拖动条组件(SeekBar) <SeekBar android:id="@+id/seekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" //设置最大值 android:progress="0" //设置初值 android:padding="10