话不多说,上图

近日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自定义星级评分控件,可实现只显示实心星星相关推荐

  1. Android开发之自定义随机验证码控件

    版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/81455593 出自:shusheng007 ...

  2. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  3. android自定义横竖双向滚动,Android开发实现自定义水平滚动的容器示例

    Android开发实现自定义水平滚动的容器示例 发布时间:2020-09-12 01:25:56 来源:脚本之家 阅读:71 作者:CharlinGod 本文实例讲述了Android开发实现自定义水平 ...

  4. android实现新闻内容显示功能,Android开发实现自定义新闻加载页面功能实例

    本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_U ...

  5. 《Android开发卷——自定义日期选择器(三)》

                 继 <Android开发卷--自定义日期选择器(一)>:http://blog.csdn.net/chillax_li/article/details/19047 ...

  6. 《Android开发卷——自定义日期选择器(二)》

    (小米手机) (中兴手机) 在上一篇中,我介绍了一般公司都会自定义时间日期选择器,并结合自己所做的项目给大家参考. 工作实录之<Android开发卷--自定义日期选择器(一)>链接:htt ...

  7. 【Android开发】自定义圆角button样式

    [Android开发]自定义圆角button样式 结果图 步骤 在res/drawable中新建一个drawable文件,自定义命名为btu.xml; 在btu.xml中设置圆角大小和填充颜色,代码如 ...

  8. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  9. Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

最新文章

  1. build unity 丢失_Unity Build PS4文件时的一些坑
  2. C# 获取目录下文件
  3. GET和POST两种基本请求方法的区别(转载)
  4. XXX管理平台系统——架构
  5. 微软开源基于.NET Core的量子开发工具包 QDK
  6. c++string类的常用方法详解
  7. HTTP之缓存 Cache-Control
  8. [ESP8266]--开启服务器模式和客户端模式
  9. python3操作excel(xls与xlsx版本的爱恨情仇)
  10. 排序算法java快速排序_快速排序算法--Java实现
  11. 【简介】操作系统概念
  12. Java包装类的缓存范围
  13. 动画 - 收藏集 - 掘金
  14. tensorflow实现LeNet-5模型
  15. flag - 待浏览学习网站
  16. 我的Java秋招面经大合集
  17. JavaScript学习手册四:JS对象
  18. Python初学者:元组数据操作,输出元组内7的倍数以及个位是7的数
  19. 保持应用后台,熄屏状态下继续运行
  20. 浅谈大数据之足球盘口赔率水位分析的思路与神准预测技巧(一)

热门文章

  1. 贝叶斯、先验估计、后验估计、最大似然估计、最大后验估计
  2. 缘何Square可以在移动支付领域上成功?
  3. Linux有问必答:如何为在Linux中安装兄弟牌打印机
  4. 视屏接口系列(一 ) ----------VGA(对与数信号显示器要加载A/D,延时拖尾、质量下降)...
  5. 短信猫AT+CMGL指令接收短信明明有短信但串口调试就是错误
  6. 使用Gitblit 搭建Windows Git服务器
  7. Spring Bean作用域实例
  8. oracle易忘函数用法(6)
  9. 浅谈Nginx服务器的内部核心架构设计
  10. php5.6+Redis+Windows7安装 (phpstudy)