Android自定义View实现五星好评效果
时间:2022-07-27
本文章向大家介绍Android自定义View实现五星好评效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了Android实现五星好评效果的具体代码,供大家参考,具体内容如下
这个效果想必大家都非常熟悉,那么Android如何自定义实现这种效果呢?
首先自定义属性:
<?xml version="1.0" encoding="utf-8"?
<resources
<declare-styleable name="RatingStar"
<attr name="starNormal" format="reference"/
<attr name="starFocus" format="reference"/
<attr name="starNumber" format="integer"/
</declare-styleable
</resources
下面看看具体实现:
/**
* Created by Michael on 2019/11/1.
*/
public class RatingStar extends View {
private int normalId;
private int focusId;
private Bitmap normalImg;
private Bitmap focusImg;
private int number;
private int w1;
private int h1;
private int marginLeft;
private int marginTop;
private int marginBottom;
private int marginRight;
private int height;
private int width;
private int p;
private float w0;
private int i0;
private int mGrade;
public RatingStar(Context context) {
this(context,null);
}
public RatingStar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public RatingStar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.RatingStar);
normalId = array.getResourceId(R.styleable.RatingStar_starNormal,0);
focusId = array.getResourceId(R.styleable.RatingStar_starFocus,0);
normalImg = BitmapFactory.decodeResource(getResources(), normalId);
focusImg = BitmapFactory.decodeResource(getResources(), focusId);
number = array.getInteger(R.styleable.RatingStar_starNumber,5);
array.recycle();
i0 = -1;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
w1 = normalImg.getWidth();
h1 = normalImg.getHeight();
//中间间隔
p = 30;
marginTop = 20;
marginBottom = 20;
marginLeft = 20;
marginRight = 20;
height = h1 + marginTop + marginBottom;
width = w1 *number+(number-1)*p +marginLeft+marginRight;
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < number; i++) {
if (i <= i0){
canvas.drawBitmap(focusImg,i*w1+marginLeft+i*p,marginTop,null);
mGrade = i+1;
}else{
canvas.drawBitmap(normalImg,i*w1+marginLeft+i*p,marginTop,null);
}
}
Log.e("msg","我被调用了!");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();//相对于控件自身的距离
//event.getRawX() 相对于屏幕的距离
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//case MotionEvent.ACTION_UP:
w0 = getWidth()/5;
i0 = (int) (x/w0);
//性能优化,减少onDraw()调用
if (mGrade == i0+1){
return true;
}
invalidate();
break;
}
return true;
}
}
最后看看具体布局中使用:
<com.example.star.RatingStar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:starNormal="@mipmap/star_normal"
app:starFocus="@mipmap/star_selected"
app:starNumber="5"
/
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 期待已久的直播能力开放了!年底之前来波大的
- 两个目录中,删除其中一个目录中同名文件的做法
- linux下监控某个目录是否被更改
- centos下升级git版本的操作记录
- linux下core file size设置笔记
- linux下文件加密操作记录
- python的with语句,超级强大
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- Linux下性能调试工具-top和sar运维笔记
- Apache+wsgi+flask部署
- “勒索病毒”到底会勒索啥,尽可以做到让全球对之恐惧无奈!
- 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)
- “AS3.0高级动画编程”学习:第二章转向行为(下)
- windows系统中eclipse C开发环境的架设
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Codeforces 1323 div2题解ABC
- order排序
- HDU 1421 搬寝室 解题报告(超详细)
- codeforce 270B Multithreading
- flex-wrap align-content详解
- Code force-CodeCraft-20 (Div. 2) D. Nash Matrix 详解(DFS构造)
- HDU Problem D [ Humble number ]——基础DP丑数序列
- Java开发编程规范: 3.代码格式
- flex-direction
- css中清除浮动方式五
- css中-清除浮动方式四
- forin forof forEach myForEach
- 深拷贝,你懂吗?
- Codeforce-CodeCraft-20 (Div. 2)-C. Primitive Primes(本原多项式+数学推导)
- DOM事件机制(原理级别的)