星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星
话不多说,上图
近日app需求弄一个等级展示,看了下UI图,只显示实星(点亮的星星).如图
但是网上关于星级评分的例子大多这样
也展示虚心星星
通过自定义Viewpackage com.starsbar;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class StarBar extends View {
private int starDistance = 0; //星星间距
private int starCount = 5; //星星个数
private int starSize; //星星高度大小,星星一般正方形,宽度等于高度
private float starMark = 0.0F; //评分星星
private Bitmap starFillBitmap; //亮星星
private Drawable starEmptyDrawable; //暗星星
private OnStarChangeListener onStarChangeListener;//监听星星变化接口
private Paint paint; //绘制星星画笔
private boolean integerMark = false;
private boolean clickAble = true;
public StarBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public StarBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
/**
* 初始化UI组件
*/
private void init(Context context, AttributeSet attrs) {
setClickable(true);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.StarBar);
this.starDistance = (int) mTypedArray.getDimension(R.styleable.StarBar_starDistance, 0);
this.starSize = (int) mTypedArray.getDimension(R.styleable.StarBar_starSize, 20);
this.starCount = mTypedArray.getInteger(R.styleable.StarBar_starCount, 5);
this.starEmptyDrawable = mTypedArray.getDrawable(R.styleable.StarBar_starEmpty);
this.starFillBitmap = drawableToBitmap(mTypedArray.getDrawable(R.styleable.StarBar_starFill));
mTypedArray.recycle();
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
}
/**
* 设置星星是否可以点击和滑动改变
*/
public void setClickAble(boolean clickAble) {
this.clickAble = clickAble;
}
/**
* 设置是否需要整数评分
*
* @param integerMark
*/
public void setIntegerMark(boolean integerMark) {
this.integerMark = integerMark;
}
/**
* 设置显示的星星的分数
*
* @param mark
*/
public void setStarMark(float mark) {
if (integerMark) {
starMark = (int) Math.ceil(mark);
} else {
starMark = Math.round(mark * 10) * 1.0f / 10;
}
if (this.onStarChangeListener != null) {
this.onStarChangeListener.onStarChange(starMark); //调用监听接口
}
invalidate();
}
/**
* 获取显示星星的数目
*
* @return starMark
*/
public float getStarMark() {
return starMark;
}
/**
* 定义星星点击的监听接口
*/
public interface OnStarChangeListener {
void onStarChange(float mark);
}
/**
* 设置监听
*
* @param onStarChangeListener
*/
public void setOnStarChangeListener(OnStarChangeListener onStarChangeListener) {
this.onStarChangeListener = onStarChangeListener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(starSize * starCount + starDistance * (starCount - 1), starSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (starFillBitmap == null || starEmptyDrawable == null) {
return;
}
for (int i = 0; i < starCount; i++) {
starEmptyDrawable.setBounds((starDistance + starSize) * i, 0, (starDistance + starSize) * i + starSize, starSize);
starEmptyDrawable.draw(canvas);
}
if (starMark > 1) {
canvas.drawRect(0, 0, starSize, starSize, paint);
if (starMark - (int) (starMark) == 0) {
for (int i = 1; i < starMark; i++) {
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize, starSize, paint);
}
} else {
for (int i = 1; i < starMark - 1; i++) {
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize, starSize, paint);
}
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize * (Math.round((starMark - (int) (starMark)) * 10) * 1.0f / 10), starSize, paint);
}
} else {
canvas.drawRect(0, 0, starSize * starMark, starSize, paint);
}
}
/**
* 设置星星总数
*/
public void setStarCount(int count){
starCount = count;
}
/**
* 设置星星亮的颗数
*/
public void setRating(int rating){
if (integerMark) {
starMark = (int) Math.ceil(rating);
} else {
starMark = Math.round(rating * 10) * 1.0f / 10;
}
if (this.onStarChangeListener != null) {
this.onStarChangeListener.onStarChange(starMark); //调用监听接口
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (clickAble) {
int x = (int) event.getX();
if (x < 0) x = 0;
if (x > getMeasuredWidth()) x = getMeasuredWidth();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
setStarMark(x * 1.0f / (getMeasuredWidth() * 1.0f / starCount));
break;
}
case MotionEvent.ACTION_MOVE: {
setStarMark(x * 1.0f / (getMeasuredWidth() * 1.0f / starCount));
break;
}
case MotionEvent.ACTION_UP: {
break;
}
}
invalidate();
}
return super.onTouchEvent(event);
}
/**
* drawable转bitmap
*
* @param drawable
* @return
*/
private Bitmap drawableToBitmap(Drawable drawable) {
if (drawable == null) return null;
Bitmap bitmap = Bitmap.createBitmap(starSize, starSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, starSize, starSize);
drawable.draw(canvas);
return bitmap;
}
}
解决方案,为了只显示实心数,加了2个方法,注意:/**
* 设置星星总数
*/
public void setStarCount(int count){
starCount = count;
}
/**
* 设置星星亮的颗数
*/
public void setRating(int rating){
if (integerMark) {
starMark = (int) Math.ceil(rating);
} else {
starMark = Math.round(rating * 10) * 1.0f / 10;
}
if (this.onStarChangeListener != null) {
this.onStarChangeListener.onStarChange(starMark); //调用监听接口
}
invalidate();
}
在activity中配合使用即可实现上述需求://不可选择的starBar,只做显示用 不显示空心
starBar2=findViewById(R.id.starBar2);
starBar2.setClickAble(false);
starBar2.setStarCount(3);
starBar2.setRating(3);
另介绍另外一种星级评分 YStarView
星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星相关推荐
- Android开发之自定义随机验证码控件
版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/81455593 出自:shusheng007 ...
- Android开发技巧——自定义控件之组合控件
Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...
- android自定义横竖双向滚动,Android开发实现自定义水平滚动的容器示例
Android开发实现自定义水平滚动的容器示例 发布时间:2020-09-12 01:25:56 来源:脚本之家 阅读:71 作者:CharlinGod 本文实例讲述了Android开发实现自定义水平 ...
- android实现新闻内容显示功能,Android开发实现自定义新闻加载页面功能实例
本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_U ...
- 《Android开发卷——自定义日期选择器(三)》
继 <Android开发卷--自定义日期选择器(一)>:http://blog.csdn.net/chillax_li/article/details/19047 ...
- 《Android开发卷——自定义日期选择器(二)》
(小米手机) (中兴手机) 在上一篇中,我介绍了一般公司都会自定义时间日期选择器,并结合自己所做的项目给大家参考. 工作实录之<Android开发卷--自定义日期选择器(一)>链接:htt ...
- 【Android开发】自定义圆角button样式
[Android开发]自定义圆角button样式 结果图 步骤 在res/drawable中新建一个drawable文件,自定义命名为btu.xml; 在btu.xml中设置圆角大小和填充颜色,代码如 ...
- android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容
简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...
- Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...
简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...
最新文章
- build unity 丢失_Unity Build PS4文件时的一些坑
- C# 获取目录下文件
- GET和POST两种基本请求方法的区别(转载)
- XXX管理平台系统——架构
- 微软开源基于.NET Core的量子开发工具包 QDK
- c++string类的常用方法详解
- HTTP之缓存 Cache-Control
- [ESP8266]--开启服务器模式和客户端模式
- python3操作excel(xls与xlsx版本的爱恨情仇)
- 排序算法java快速排序_快速排序算法--Java实现
- 【简介】操作系统概念
- Java包装类的缓存范围
- 动画 - 收藏集 - 掘金
- tensorflow实现LeNet-5模型
- flag - 待浏览学习网站
- 我的Java秋招面经大合集
- JavaScript学习手册四:JS对象
- Python初学者:元组数据操作,输出元组内7的倍数以及个位是7的数
- 保持应用后台,熄屏状态下继续运行
- 浅谈大数据之足球盘口赔率水位分析的思路与神准预测技巧(一)
热门文章
- 贝叶斯、先验估计、后验估计、最大似然估计、最大后验估计
- 缘何Square可以在移动支付领域上成功?
- Linux有问必答:如何为在Linux中安装兄弟牌打印机
- 视屏接口系列(一 ) ----------VGA(对与数信号显示器要加载A/D,延时拖尾、质量下降)...
- 短信猫AT+CMGL指令接收短信明明有短信但串口调试就是错误
- 使用Gitblit 搭建Windows Git服务器
- Spring Bean作用域实例
- oracle易忘函数用法(6)
- 浅谈Nginx服务器的内部核心架构设计
- php5.6+Redis+Windows7安装 (phpstudy)