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(imStartTotalNumber){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。