这篇文章主要为大家详细介绍了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"
/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:Android自定义View实现五星好评效果
基础教程推荐
猜你喜欢
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Android开发Compose集成高德地图实例 2023-06-15
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- Android实现短信验证码输入框 2023-04-29
- iOS开发 全机型适配解决方法 2023-01-14
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- Flutter进阶之实现动画效果(三) 2022-10-28
- IOS获取系统相册中照片的示例代码 2023-01-03
- iOS开发使用XML解析网络数据 2022-11-12