Android 自定义RatingBar实现

本文详细介绍了如何在Android开发中自定义RatingBar,包括关键代码、SVG图标、颜色配置、属性定义和Activity实现,旨在提供一个完整的自定义评分条解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android开发中,经常要实现星星的评分效果如下图,所以今天就记录下来,以便他人使用。

                                   

 

 

1、自定义RatingBar代码:

package com.example.myapplicationtest;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;




/**
 * @author
 * @package
 * @desc 评星
 * @date 2019/7/05 18:44
 * @copyright
 * @company
 */
public class RatingBar extends View {
    private static final String TAG = "AirRatingBar";
    /**
     * 默认,半个,全部选中
     */
    private Bitmap mRatingNormal, mRatingHalf, mRatingSelected;
    /**
     * 总数
     */
    private int mRatingTotalNum = 5;
    /**
     * 选中的数量
     */
    private float mRatingSelectedNumber;
    /**
     * 是否画全部
     */
    private Status status = Status.FULL;
    /**
     * 是否画全部
     * true 画全部
     * false 画半个
     */
    private boolean isFull;
    /**
     * 状态变化监听
     */
    private OnStarChangeListener mOnStarChangeListener;
    /**
     * 画笔
     */
    private Paint mPaint;
    /**
     * 间距
     */
    private int mRatingDistance;
    /**
     * 宽和高
     */
    private float mRatingWidth;
    private float mRatingHeight;
    /**
     * 是否可选中
     */
    private boolean selectable;

    public RatingBar(Context context) {
        this(context, null);
    }

    public RatingBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RatingBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
        initTypeArray(context, attrs);
    }

    /**
     * 画笔
     */
    private void initPaint() {
        mPaint = new Paint();
    }

    /**
     * 属性
     *
     * @param context
     * @param attrs
     */
    private void initTypeArray(Context context, AttributeSet attrs) {
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AirRatingBar);

        // 未选中的图片资源
        int starNormalId = array.getResourceId(R.styleable.AirRatingBar_ratingDefault, 0);
        if (starNormalId == 0) {
            throw new IllegalArgumentException("请设置属性 starNormal");
        }
        mRatingNormal = getBitmap(context, starNormalId);
        // 选中一半的图片资源
        int starHalfId = array.getResourceId(R.styleable.AirRatingBar_ratingHalf, 0);
        if (starHalfId != 0) {
            mRatingHalf = getBitmap(context, starHalfId);
        }
        // 选中全部的图片资源
        int starSelectedId = array.getResourceId(R.styleable.AirRatingBar_ratingSelect, 0);
        if (starSelectedId == 0) {
            throw new IllegalArgumentException("请设置属性 starSelected");
        }
        mRatingSelected = getBitmap(context, starSelectedId);
        // 如果没设置一半的图片资源,就用全部的代替
        if (starHalfId == 0) {
            mRatingHalf = mRatingSelected;
        }

        mRatingTotalNum = array.getInt(R.styleable.AirRatingBar_ratingTotalNum, mRatingTotalNum);
        mRatingSelectedNumber = array.getFloat(R.styleable.AirRatingBar_ratingDefaultSelectNum, mRatingSelectedNumber);
        mRatingDistance = (int) array.getDimension(R.styleable.AirRatingBar_ratingDistance, 0);
        mRatingWidth = array.g
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值