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评分控件的更多相关文章

  1. Android星星评分控件RatingBar的使用

    在Android的开发中,有一个叫做评分控件RatingBar,我们可以使用该控件做等级划分.评分等作用,星星形状显示,也可以半星级别,我们来看一下评分控件如何使用. 布局文件中定义控件以及属性,这里 ...

  2. Android自定义评分控件:RatingStarView

    RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ...

  3. UWP开发---DIY星级评分控件

    一,需求来源 在开发韩剧TV UWP过程中,遇到了星级评分的控件问题,在安卓和html中很容易用现有的轮子实现星级评分,搜索了一下目前UWP还未有相关文章,在WPF的一篇文章中使用Photo shop ...

  4. Android 拖动条/滑动条控件、星级评分控件

    ProgressBar有2个子控件: SeekBar   拖动条控件 RatingBar   星级评分控件 1.拖动条控件 <SeekBar android:layout_width=" ...

  5. Web用户控件开发--星型评分控件

    本文中分享一个实现简单,使用方便的星型评分控件. 一:贴几张测试图片先: 二.星型评分控件的实现: RatingBar.ascx: <%@ Control Language="C#&q ...

  6. iOS- 非整星的评分控件(支持小数)

    概述 订单评论里实现星级评分控件: 简单整星评价与非整星的精评价. 详细 代码下载:http://www.demodashi.com/demo/10711.html 现在很多应用都有评分功能. 有了订 ...

  7. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  8. (转)sl简单自定义win窗体控件

    sl简单自定义win窗体控件      相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个  而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...

  9. WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

随机推荐

  1. POJ 1036

    #include<iostream> #include<algorithm> #define MAXN 205 using namespace std; struct node ...

  2. windows 安装openssl

    参考文章:http://www.cnblogs.com/tangxin-blog/p/5724071.html 准备条件: 1.VS2012 (携带c++) 2.下载openssl 源码 3.安装Pe ...

  3. 我与GitHub的第一次——自制音乐文件修改器

    背景: 随机播放,所有的音乐播放器里面现在几乎都有这个功能吧.但是有没有发现,自己的播放器在选择随机播放的时候,经常会听到重复顺序的歌曲呢?反正我是有这样的感觉,无耐自己平时下的歌曲都是“歌手名—歌曲 ...

  4. 搭建安卓开发环境 hello world andriod

    万事开头能嘛.先要搭建开发环境,主要用到java,会java的同学福音啊. 一 相关下载 1.Jdk.(java的开发环境).  http://www.oracle.com/technetwork/j ...

  5. AAAI2019 | 基于区域分解集成的目标检测 论文解读

    Object Detection based on Region Decomposition and Assembly AAAI2019 | 基于区域分解集成的目标检测 论文解读 作者 | 文永亮 学 ...

  6. SpringBoot入门 (一) HelloWorld

    一 什么是springboot springboot是一个全新的框架,它设计的目的简化spring项目的初始环境的搭建和开发,主要有以下几个特点: 1.简化初始配置 ,可与主流框架集成: 2.内置Se ...

  7. tomcat与jboss等容器的区别

    1.JBoss 是 J2EE 应用服务器,而 Tomcat 只是一个 Servlet 容器,或者说是一个简单的 J2EE 应用服务器. JBoss 中的 Servlet 容器还是 Tomcat. 与  ...

  8. 做网站,乱码?应该选用什么编码?GB2312 ? UTF-8 ?

    当然了,最常用的编码也就是GB2312 和 UTF-8 了. ================================================起==================== ...

  9. 16.Generator 函数的异步应用

    Generator 函数的异步应用 Generator 函数的异步应用 异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是"单线程"的,如果没有异 ...

  10. VB如何连接访问数据库Access

    VB如何连接访问数据库Access 听语音 | 浏览:10675 | 更新:2015-05-05 11:26 | 标签:连接 access 1 2 3 4 5 6 7 分步阅读 VB即Visual B ...