Android自定义星星评分控件代替RatingBar的使用
来源:互联网 发布:开淘宝店到底怎么样 编辑:程序博客网 时间:2024/05/18 16:36
大家做android的就知道android自带的控件很丑,所以很多控件都需要自定义,例如这里说道的RatingBar控件,自带的奇丑无比,那么下面看看怎么利用自定义控件代替RatingBar控件吧,直接上个工具类,可以直接粘贴使用
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;/** * Created by 唐小糖 on 2017/1/13. * 自定义 星星控件,空心实心的五角心 */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; 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组件 * * @param context 当前视图 * @param attrs 参数 */ private void init(Context context, AttributeSet attrs){ setClickable(true); TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar); this.starDistance = (int) mTypedArray.getDimension(R.styleable.RatingBar_starDistance, 0); this.starSize = (int) mTypedArray.getDimension(R.styleable.RatingBar_starSize, 20); this.starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5); this.starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty); this.starFillBitmap = drawableToBitmap(mTypedArray.getDrawable(R.styleable.RatingBar_starFill)); mTypedArray.recycle(); paint = new Paint(); paint.setAntiAlias(true); paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); } /** * 设置是否需要整数评分 * @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); } } @Override public boolean onTouchEvent(MotionEvent event) { 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 bitmap */ 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; }}然后在values下的attr文件中新增,如果没有attr文件请自定百度
<declare-styleable name="RatingBar"> <!--星星间距--> <attr name="starDistance" format="dimension" /> <!--星星大小--> <attr name="starSize" format="dimension" /> <!--星星个数--> <attr name="starCount" format="integer" /> <!--星星空图--> <attr name="starEmpty" format="reference" /> <!--星星满图--> <attr name="starFill" format="reference" /> </declare-styleable>然后即可在布局中直接这样引用即可
<自定义布局路径 android:id="@+id/starBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/x20" ratingbar:starCount="5" ratingbar:starDistance="@dimen/x10" ratingbar:starEmpty="@mipmap/star_empty" ratingbar:starFill="@mipmap/star_full" ratingbar:starSize="@dimen/x30" />请注意在布局中需要在布局根目录上添加上其中有一步就是要自定义一个xml的命名空间后然后再给自定义属性赋值:
xmlns:app="http://schemas.android.com/apk/res-auto"注释很详细就不做太多解释了,star_empty,star_full为两张图,不用解释了吧
阅读全文
0 0
- Android自定义星星评分控件代替RatingBar的使用
- Android星星评分控件RatingBar的使用
- Android星星评分控件RatingBar的使用
- Android星星评分控件RatingBar的使用
- 使用ratingbar评分的星星
- Android星星评分控件RatingBar的使…
- Android自定义Ratingbar星星实现评分
- Android 自定义RatingBar评分控件
- Android自定义RatingBar(评分控件)
- Android 自定义 RatingBar (评分控件)
- Android自定义RatingBar,评分控件
- android星星评分自定义控件
- Android自定义星星评分控件
- Android 自定义ratingBar(评分小星星)的使用
- Android 控件seekbar进度条、ratingbar星星评分条
- Android中自定义RatingBar(评分控件)的方法
- 自定义RatingBar 评分控件
- 【Android 开发】:UI控件之 RatingBar 评分控件的使用
- linux中正则表达式、find、xargs、grep以及sed等命令的用法
- spring Security4 和 oauth2整合 注解+xml混合使用(替换用户名密码认证)
- 一文读懂Go的net/http标准库
- struts2业务控制类(Action)获取页面请求参数的几种方式
- Android资源文件分析
- Android自定义星星评分控件代替RatingBar的使用
- 7款经典游戏 诠释高级算法精髓
- GAN学习笔记:MMGAN:Manifold-Matching Generative Adversarial Network
- 平常心
- 【java基础】19.网络编程
- js写排序的方法。
- [Office] 常用的一些快捷键 [持续更新]
- 使用 xml 保存通讯录信息
- js数组方法大全