自定义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自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...
随机推荐
- Storm原理及安装
http://my.oschina.net/leejun2005/blog/147607 http://www.storm-geek.com/forum.php http://www.zhangjih ...
- Oracle 锁问题处理
Oracle 锁问题处理 锁等待问题是一个常见的问题 查看持有锁的对象 查看事务正在执行的语句,与应用确认是否能够kill kill 对应的session
- (转)MySQL 插入数据时,中文乱码问题的解决
MySQL 插入数据时,中文乱码问题的解决 原文:http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html 当向 MySQL 数据库插 ...
- centos 7 nginx 安装
1.下载nginx rpm包 下载地址:http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/ ,可查看所有安装包 从中如下载: wget h ...
- android瓦片地图技术研究
最近根据公司项目需求,需要制作场馆的室内图并且实现根据rfid信号的自动定位功能,研究了好久找到了一个目前为止还算好用的瓦片地图工具——TileView. github连接:https://githu ...
- Chapter 3 Phenomenon——5
I saw several things simultaneously. 我同时看见了几件事情. Nothing was moving in slow motion,the way it does i ...
- Python的Django框架中forms表单类的使用方法详解
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- RR和RC复合语句加锁
mysql版本:5.7 RR复合语句: insert/update/delete+select,+号左边是影响数据的排他锁,+号右边是查询(当前读,其实相当于lock in share mode)到数 ...
- CentOS 7 安装 RabbitMQ 3.7
目录 CentOS 7 安装 RabbitMQ 3.7 安装Erlang 安装依赖 创建yum源 参考 添加内容 安装 进入erlang命令行表示成功 安装 socat RabbitMQ 安装 sys ...
- 关于拓展jQuery功能插件的写法
有两种方法: 1.jQuery.fn.extend() 用于将一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法 例子: <span id="test"& ...