Android自定义View仿大众点评星星评分控件
本文实例为大家分享了Android仿大众点评星星评分控件的具体代码,供大家参考,具体内容如下
话不多说,直接上代码,这里采用的是自定View
publicclassRatingBarextendsView{ //正常、半个和选中的星星 privateBitmapmStarNormal,mStarHalf,mStarSelected; //星星的总数 privateintmStartTotalNumber=5; //选中的星星个数 privatefloatmSelectedNumber; //星星之间的间距 privateintmStartDistance; //是否画满 privateStatusmStatus=Status.FULL; //星星的宽高 privatefloatmStarWidth; privatefloatmStarHeight; //星星选择变化的回调 privateOnStarChangeListenermOnStarChangeListener; //是不是要画满,默认不画半个的 privatebooleanisFull; //画笔 privatePaintmPaint=newPaint(); //用于判断是绘制半个,还是全部 privateenumStatus{ FULL,HALF } publicvoidsetOnStarChangeListener(OnStarChangeListenerOnStarChangeListener){ this.mOnStarChangeListener=OnStarChangeListener; } publicRatingBar(Contextcontext){ this(context,null); } publicRatingBar(Contextcontext,@NullableAttributeSetattrs){ this(context,attrs,0); } publicRatingBar(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); TypedArrayarray=context.obtainStyledAttributes(attrs,R.styleable.RatingBar); //未选中的图片资源 intstarNormalId=array.getResourceId(R.styleable.RatingBar_starEmptyRes,0); if(starNormalId==0){ thrownewIllegalArgumentException("请设置属性starNormal"); } mStarNormal=BitmapFactory.decodeResource(getResources(),starNormalId); //选中一半的图片资源 intstarHalfId=array.getResourceId(R.styleable.RatingBar_starHalfRes,0); if(starHalfId!=0){ mStarHalf=BitmapFactory.decodeResource(getResources(),starHalfId); } //选中全部的图片资源 intstarSelectedId=array.getResourceId(R.styleable.RatingBar_starSelectedRes,0); if(starSelectedId==0){ thrownewIllegalArgumentException("请设置属性starSelected"); } mStarSelected=BitmapFactory.decodeResource(getResources(),starSelectedId); //如果没设置一半的图片资源,就用全部的代替 if(starHalfId==0){ mStarHalf=mStarSelected; } mStartTotalNumber=array.getInt(R.styleable.RatingBar_startTotalNumber,mStartTotalNumber); mSelectedNumber=array.getFloat(R.styleable.RatingBar_selectedNumber,mSelectedNumber); mStartDistance=(int)array.getDimension(R.styleable.RatingBar_starDistance,0); mStarWidth=array.getDimension(R.styleable.RatingBar_starWidth,0); mStarHeight=array.getDimension(R.styleable.RatingBar_starHeight,0); isFull=array.getBoolean(R.styleable.RatingBar_starIsFull,true); array.recycle(); //如有指定宽高,获取最大值去改变星星的大小(星星是正方形) intstarWidth=(int)Math.max(mStarWidth,mStarHeight); if(starWidth>0){ mStarNormal=resetBitmap(mStarNormal,starWidth); mStarSelected=resetBitmap(mStarSelected,starWidth); mStarHalf=resetBitmap(mStarHalf,starWidth); } //计算一半还是全部(小数部分小于等于0.5就只是显示一半) if(!isFull){ intnum=(int)mSelectedNumber; if(mSelectedNumber<=(num+0.5f)){ mStatus=Status.HALF; } } } /** *设置全部选中的图片 * *@parambitmap */ publicvoidallImage(Bitmapbitmap){ mStarSelected=bitmap; intstarWidth=(int)Math.max(mStarWidth,mStarHeight); if(starWidth>0){ mStarNormal=resetBitmap(mStarNormal,starWidth); mStarSelected=resetBitmap(mStarSelected,starWidth); mStarHalf=resetBitmap(mStarHalf,starWidth); } invalidate(); } /** *设置选中一半的图片 * *@parambitmap */ publicvoidmStarHalf(Bitmapbitmap){ mStarHalf=bitmap; intstarWidth=(int)Math.max(mStarWidth,mStarHeight); if(starWidth>0){ mStarNormal=resetBitmap(mStarNormal,starWidth); mStarSelected=resetBitmap(mStarSelected,starWidth); mStarHalf=resetBitmap(mStarHalf,starWidth); } invalidate(); } /** *如果用户设置了图片的宽高,就重新设置图片 */ publicBitmapresetBitmap(BitmapbitMap,intstartWidth){ //得到新的图片 returnBitmap.createScaledBitmap(bitMap,startWidth,startWidth,true); } /** *设置选中星星的数量 */ publicvoidsetSelectedNumber(intselectedNumber){ if(selectedNumber>=0&&selectedNumber<=mStartTotalNumber){ this.mSelectedNumber=selectedNumber; invalidate(); } } /** *设置星星的总数量 */ publicvoidsetStartTotalNumber(intstartTotalNumber){ if(startTotalNumber>0){ this.mStartTotalNumber=startTotalNumber; invalidate(); } } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); //用正常的一个星星图片去测量高 intheight=getPaddingTop()+getPaddingBottom()+mStarNormal.getHeight(); //宽=星星的宽度*总数+星星的间距*(总数-1)+padding intwidth=getPaddingLeft()+getPaddingRight()+mStarNormal.getWidth()*mStartTotalNumber+mStartDistance*(mStartTotalNumber-1); setMeasuredDimension(width,height); } @Override protectedvoidonDraw(Canvascanvas){ //循环绘制 for(inti=0;i0){ left=getPaddingLeft()+i*(mStarNormal.getWidth()+mStartDistance); } floattop=getPaddingTop(); //绘制选中的星星 if(i mStartTotalNumber){ position=mStartTotalNumber; } //计算绘制的星星是不是满的 floatresult=x-startWidth*(position-1); Statusstatus; //结果大于一半就是满的 if(result>startWidth*0.5f){ //满的 status=Status.FULL; }else{ //一半的 status=Status.HALF; } if(isFull){ status=Status.FULL; } //减少绘制 if(mSelectedNumber!=position||status!=mStatus){ mSelectedNumber=position; mStatus=status; invalidate(); if(mOnStarChangeListener!=null){ position=(int)(mSelectedNumber-1); //选中的数量:满的就回调(1.0这种),一半就(0.5这种) floatselectedNumber=status==Status.FULL?mSelectedNumber :(mSelectedNumber-0.5f); mOnStarChangeListener.OnStarChanged(selectedNumber, position<0?0:position); } } break; } returntrue; } //回调监听(选中的数量,位置) publicinterfaceOnStarChangeListener{ voidOnStarChanged(floatselectedNumber,intposition); } }
自定义属性
xml配置
在activity里rb指的是RatingBarrb;
大概就是这个样子具体的需求需要根据UI提供图来.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。