自定义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自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...
随机推荐
- Pycharm常用快捷键,以及设置
工欲善其事必先利其器,Python开发利器Pycharm常用快捷键以及配置如下,相信有了这些快捷键,你的开发会事半功倍 一 常用快捷键 编辑类: Ctrl + D 复制选定的区 ...
- Android 开发工具类 21_SAXForHandler
解析 XML 有两种形式: 1.XMLReader XMLReaser xmlReader = saxParser.getXMLReader(); xmlReadeer.setContentHandl ...
- Centos调整时间时区
一台VPS的时间出错,使用常规手段修改均失败.提示hwclock failed : ntpdate stdtime.sinica.edu.tw 如果你的 VPS 提示没有 ntpdate 这个命令,可 ...
- NFS文件共享服务搭建
一.概述 NFS工作流程 1.由程序在NFS客户端发起存取文件的请求,客户端本地的RPC(rpcbind)服务会通过网络向NFS服务端的RPC的111端口发出文件存取功能的请求. 2.NFS服务端的R ...
- 糗事之 -- 用ssh公钥实现免密码登录
前言:工作原因,每天都会登录好多次服务器,每次都是ssh root@192.168..... 然后输入密码,来来回回输几次真是很烦啊. 问题:怎么可以在每次ssh连接服务器时不用输入密码,直接登录? ...
- Spring IOC(DI)
软件152 余建强 1 什么是IOC IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...
- mybatis使用拦截器显示sql,使用druid配置连接信息
1.显示出sql内容: 新建2个类:MybatisInterceptor :拦截sql,并获得输出sql内容 package com.cpp.core.filter; import java.text ...
- HTML5中Access-Control-Allow-Origin解决跨域问题
www.111cn.net 更新:2015-01-07 编辑:flyfox 来源:转载 跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Acc ...
- 使用ms owin 搭建oauth2 server
http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server 有示例代码 关于token的 ...
- SQL存储过程基础语法及实例
1.定义变量简单赋值 declare @a int //声明一个变量a 赋初值为5 print @a //输出变量a 2.创建临时表 if OBJECT_ID('tempdb.#FlightState ...