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. Inno Setup入门(二十三)——Inno Setup类参考(9)

    今天就简单说一下ProgressBar. TNewProgressBar = class(TWinControl)   property Min: Longint; read write;   pro ...

  2. (转)更换镜像rootvg卷组中的硬盘

    F85系统镜像盘更换实录之一:删除原有镜像操作 # cfgmgr # lsdev -Cc disk hdisk0 Available 11-09-00-8,0  16 Bit LVD SCSI Dis ...

  3. [webrtc] rtcp模块中rtt时间计算

    RTT指 round-trip time,即计算AB两端的往返时延 这里可以分成两个问题: 如何在A端估算A和B之间的RTT时间? 如何在B端估算A和B之间的RTT时间? 本文参考资料:rfc 355 ...

  4. 解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏

    目录: 从明源动力到创新工场这一路走来 解析ASP.NET WebForm和Mvc开发的区别 解析ASP.NET 和Mvc开发之查询数据实例 ----------------------------- ...

  5. netsh 第一次用这命令

    转载自 目标是WIN7 X64,且开启了防火墙,想要用他的机器去访问别的机器,又不想登陆他的系统,常规办法一般是上传一个htran,然后进行转发,但是对方有杀软,有被杀的可能性,所以我用另外一种办法达 ...

  6. OpenStack-Queens版 实践

    OpenStack简介 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是一个开源 ...

  7. springcloud-06-feign的使用

    在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

  8. json-lib使用——JSONObject与JSONArray

    ps:看这篇博客之前首先要引入工具包json-lib-2.2.2-jdk15.jar 资源链接:百度云:链接:https://pan.baidu.com/s/1o9k7PSu 密码:00lj 一.从O ...

  9. 再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题

    相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则,经过查看org ...

  10. i.mx6 Android5.1.1 build解析

    参考资料:理解 Android Build 系统 把总结放前面: 1. 常用编译命令 make clean 执行清理,等同于:rm -rf out/. make sdk 编译出 Android 的 S ...