自定义RatingBar评分控件
1.介绍
实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量

2.自定义属性
在values目录下的attrs.xml创建所需要的属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyRatingView">
        <attr name="normalRatingBar" format="reference" />
        <attr name="selectRatingBar" format="reference" />
        <attr name="ratingNum" format="integer" />
        <attr name="bothPadding" format="dimension" />
    </declare-styleable>
</resources>
3.自定义View如下
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.cyq.customview2.R;
/**
 * 自定义评分控件
 */
public class MyRatingView extends View {
    private Bitmap mNormalRatingBar, mSelectRatingBar;
    private int mGrateNumber = 5;
    private int mBothPadding = 5;//默认星星之间间隔为5dp
    private int mCurrentNumber = 0, mSelectNumber = 0;
    public MyRatingView(Context context) {
        this(context, null);
    }
    public MyRatingView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyRatingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyRatingView);
        int mNormalBitmapId = array.getResourceId(R.styleable.MyRatingView_normalRatingBar, 0);
        if (mNormalBitmapId == 0) {
            throw new RuntimeException("未设置属性");
        }
        mNormalRatingBar = BitmapFactory.decodeResource(getResources(), mNormalBitmapId);
        int mSelectBitmapId = array.getResourceId(R.styleable.MyRatingView_selectRatingBar, 0);
        if (mSelectBitmapId == 0) {
            throw new RuntimeException("未设置属性");
        }
        mSelectRatingBar = BitmapFactory.decodeResource(getResources(), mSelectBitmapId);
        mGrateNumber = array.getInt(R.styleable.MyRatingView_ratingNum, mGrateNumber);
        mBothPadding = array.getDimensionPixelSize(R.styleable.MyRatingView_bothPadding, 5);
        array.recycle();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int height = mNormalRatingBar.getHeight() + getPaddingTop() + getPaddingBottom();
        int width = mGrateNumber * mNormalRatingBar.getWidth()
                + mBothPadding * (mGrateNumber - 1)
                + getPaddingLeft()
                + getPaddingRight();//暂时还没有设置间隔UP
        //设置测量维度
        setMeasuredDimension(width, height);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < mGrateNumber; i++) {
            int x = (mNormalRatingBar.getWidth() + mBothPadding) * i + getPaddingLeft();
            int y = getPaddingTop();
            canvas.drawBitmap(mNormalRatingBar, x, y, null);
        }
        for (int i = 0; i < mSelectNumber; i++) {
            int x = (mSelectRatingBar.getWidth() + mBothPadding) * i + getPaddingLeft();
            int y = getPaddingTop();
            canvas.drawBitmap(mSelectRatingBar, x, y, null);
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                float moveX = event.getX();
                mCurrentNumber = (int) ((moveX - getPaddingLeft()) / (mNormalRatingBar.getWidth() + mBothPadding));
                if (mCurrentNumber < 0)
                    mCurrentNumber = 0;
                if (mCurrentNumber > 0)
                    mCurrentNumber += 1;
                //避免星星数量没变化时重复调用onDraw方法
                if (mCurrentNumber != mSelectNumber) {
                    mSelectNumber = mCurrentNumber;
                    invalidate();
                }
        }
        return true;
    }
    /**
     * 返回评分等级
     *
     * @return
     */
    public int getSelectNumber() {
        return mSelectNumber;
    }
}
XML中使用
 <com.cyq.customview2.page6.MyRatingView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:padding="10dp"
        app:bothPadding="10dp"
        app:normalRatingBar="@drawable/rating_normal_bar"
        app:ratingNum="5"
        app:selectRatingBar="@drawable/rating_select_bar" />
自定义RatingBar评分控件的更多相关文章
- Android星星评分控件RatingBar的使用
		在Android的开发中,有一个叫做评分控件RatingBar,我们可以使用该控件做等级划分.评分等作用,星星形状显示,也可以半星级别,我们来看一下评分控件如何使用. 布局文件中定义控件以及属性,这里 ... 
- Android自定义评分控件:RatingStarView
		RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ... 
- UWP开发---DIY星级评分控件
		一,需求来源 在开发韩剧TV UWP过程中,遇到了星级评分的控件问题,在安卓和html中很容易用现有的轮子实现星级评分,搜索了一下目前UWP还未有相关文章,在WPF的一篇文章中使用Photo shop ... 
- Android  拖动条/滑动条控件、星级评分控件
		ProgressBar有2个子控件: SeekBar 拖动条控件 RatingBar 星级评分控件 1.拖动条控件 <SeekBar android:layout_width=" ... 
- Web用户控件开发--星型评分控件
		本文中分享一个实现简单,使用方便的星型评分控件. 一:贴几张测试图片先: 二.星型评分控件的实现: RatingBar.ascx: <%@ Control Language="C#&q ... 
- iOS- 非整星的评分控件(支持小数)
		概述 订单评论里实现星级评分控件: 简单整星评价与非整星的精评价. 详细 代码下载:http://www.demodashi.com/demo/10711.html 现在很多应用都有评分功能. 有了订 ... 
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
		该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ... 
- (转)sl简单自定义win窗体控件
		sl简单自定义win窗体控件 相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个 而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ... 
- WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox
		一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ... 
随机推荐
- 用汇编语言(ARM 32位)编写TCP Bind Shell的菜鸟教程
			用汇编语言(ARM 32位)编写TCP Bind Shell的菜鸟教程 来源 https://www.4hou.com/info/news/9959.html Change 新闻 2018年1月19日 ... 
- 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 1、经常提及的问题
			Frequently Asked Questions Congratulations to be part of the first class of the Deep Learning Specia ... 
- mysql中UNION ALL用法
			MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 u ... 
- 搜索类网站记录 && 代理服务器
			搜索类网站记录 && 代理服务器 技巧 1.使用site 我们在搜索的时候,其实不全依赖搜索引擎也是可以的, 比如我们要搜索一个 “中国” ,可以在搜索框输入 中国 site ... 
- Android 开发工具类 11_ToolFor9Ge
			1.缩放/ 裁剪图片: 2.判断有无网络链接: 3.从路径获取文件名: 4.通过路径生成 Base64 文件: 5.通过文件路径获取到 bitmap: 6.把 bitmap 转换成 base64: 7 ... 
- JAVA使用Gecco爬虫 抓取网页内容(附Demo)
			JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三 ... 
- Redis笔记(一):Redis安装教程
			Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是目前应用最广泛的内存数据存储技术,相比之前的Me ... 
- jieba分词过程
			jieba分词最重要的就是字典,我们一般用jieba的话是用的它通用的字典,这样在特定的环境中无法分成我们想要的效果,我们需要根据我们自己的生产环境自己添加我们的字典,然后下载jieba源码进行更改, ... 
- Linux-(chgrp,chown,chmod)
			/etc/group Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件. Linux /etc/group文件 ... 
- 面试题-----求单链表的倒数第k个节点
			#include <iostream> using namespace std; struct node{ int value; struct node *next; }; struct ... 
