Android怎么实现未读消息小红点显示
今天小编给大家分享一下Android怎么实现未读消息小红点显示的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
使用 fragmentLayout 实现,可以把小红点添加到任意 view 上。
效果 添加小红点到 textview 上
添加小红点到 imageview 上
代码实现首先定义一个圆形 drawable
importandroid.graphics.Canvas;importandroid.graphics.ColorFilter;importandroid.graphics.Paint;importandroid.graphics.PixelFormat;importandroid.graphics.drawable.Drawable;importandroid.graphics.drawable.ShapeDrawable;importandroidx.annotation.IntRange;importandroidx.annotation.NonNull;importandroidx.annotation.Nullable;publicclassCircleDrawableextendsShapeDrawable{privatePaintmPaint;privateintmRadio;publicCircleDrawable(intradio,intpainColor){mPaint=newPaint();mPaint.setAntiAlias(true);mPaint.setColor(painColor);mRadio=radio;}@Overridepublicvoiddraw(@NonNullCanvascanvas){canvas.drawCircle(mRadio,mRadio,mRadio,mPaint);}@OverridepublicvoidsetAlpha(@IntRange(from=0,to=255)inti){mPaint.setAlpha(i);}@OverridepublicvoidsetColorFilter(@NullableColorFiltercolorFilter){mPaint.setColorFilter(colorFilter);}@OverridepublicintgetOpacity(){returnPixelFormat.TRANSLUCENT;}/****drawable实际宽高,圆形关键**@return*/@OverridepublicintgetIntrinsicWidth(){returnmRadio*2;}@OverridepublicintgetIntrinsicHeight(){returnmRadio*2;}}小红点实现
思路:
一个容器 fragmentLayout 包含两个 view (小红点view + 文本view 「当然也可以是其他的view」),通过 fragmentLayout 添加 view 重叠的特征实现
当前有待优化点:
1、通过 margin 实现小红点可以添加到任意位置「可以是有 layoutparams margin 实现」
2、其他
importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Rect;importandroid.graphics.drawable.ColorDrawable;importandroid.graphics.drawable.ShapeDrawable;importandroid.graphics.drawable.shapes.OvalShape;importandroid.graphics.drawable.shapes.RoundRectShape;importandroid.util.AttributeSet;importandroid.util.Printer;importandroid.view.Gravity;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.FrameLayout;importandroid.widget.TextView;importandroidx.annotation.Nullable;importcom.primer.common.constant.GravityDirection;importcom.primer.common.mvp.LoginInterface;importcom.primer.common.util.LogHelper;importcom.primer.common.util.UiHelper;importcom.primer.common.view.drawable.CircleDrawable;publicclassBadgeViewextendsTextView{privatefinalintDEFAULT_BADGE_RADIO=5;privatefinalintDEFAULT_TEXT_SIZE=5;privatefinalintDEFAULT_TEXT_COLOR=Color.WHITE;privatefinalintDEFAULT_BADGE_COLOR=Color.RED;privatefinalintDEFAULT_BADGE_GRAVITY=GravityDirection.DIRECT_TOP_LEFT;privateStringmText;privateintmBadgeColor=DEFAULT_BADGE_COLOR;privateintmTextColor=DEFAULT_TEXT_COLOR;privateintmTextSize=DEFAULT_TEXT_SIZE;privateintmBadgeRadio=DEFAULT_BADGE_RADIO;privateintmBadgeGravity=DEFAULT_BADGE_GRAVITY;privateFrameLayoutmFragmentLayout;privateViewGroupmTargetViewGroup;privateViewmTarget;privateContextmContext;publicBadgeView(Contextcontext){super(context);init(context);}publicBadgeView(Contextcontext,@NullableAttributeSetattrs){super(context,attrs);init(context);}publicBadgeView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);init(context);}publicBadgeView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr,intdefStyleRes){super(context,attrs,defStyleAttr,defStyleRes);init(context);}privatevoidinit(Contextcontext){mFragmentLayout=newFrameLayout(context);mFragmentLayout.setLayoutParams(newFrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));mContext=context;}/*****@paramcontent*@paramtarget*@paramtextColor*@paramtextSize*@parambadgeColor*@parambadgeRadio*/publicvoidshowBadgeView(Stringcontent,Viewtarget,inttextColor,inttextSize,intbadgeColor,intbadgeRadio){if(target==null){thrownewIllegalArgumentException("targetviewmustnotbenull");}mTarget=target;mTargetViewGroup=(ViewGroup)target.getParent();mTargetViewGroup.removeView(target);mTargetViewGroup.addView(mFragmentLayout,target.getLayoutParams());setTextColor(mTextColor);setTextSize(mTextSize);setGravity(Gravity.CENTER);if(content!=null&&content.length()<=3){setText(content);}//文字和半径之间的适配if(content!=null){Rectrect=newRect();this.getPaint().getTextBounds(content,0,content.length(),rect);if(content.length()<=3&&rect.width()>=mBadgeRadio){mBadgeRadio=(UiHelper.px2dip(mContext,rect.width())/2)+1;}}setBackgroundDrawable(getShapeDrawable());mFragmentLayout.addView(target);mFragmentLayout.addView(this);mTargetViewGroup.invalidate();}privateShapeDrawablegetShapeDrawable(){intradio=UiHelper.dip2px(mContext,mBadgeRadio);CircleDrawabledrawable=newCircleDrawable(radio,mBadgeColor);returndrawable;}/*****@paramcontent*@paramtarget*/publicvoidshowBadgeView(Stringcontent,Viewtarget){showBadgeView(content,target,DEFAULT_TEXT_COLOR,DEFAULT_TEXT_SIZE,DEFAULT_BADGE_COLOR,DEFAULT_BADGE_RADIO);}publicvoidshowBadgeView(Viewtarget){showBadgeView(null,target,DEFAULT_TEXT_COLOR,DEFAULT_TEXT_SIZE,DEFAULT_BADGE_COLOR,DEFAULT_BADGE_RADIO);}@OverrideprotectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){super.onMeasure(widthMeasureSpec,heightMeasureSpec);}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);}@OverrideprotectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){super.onLayout(changed,left,top,right,bottom);}}
使用
privateBadgeViewmReadBadgeView;privateTextViewmRead;mReadBadgeView=newBadgeView(getActivity());mReadBadgeView.showBadgeView("+99",mRead);
以上就是“Android怎么实现未读消息小红点显示”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。