经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android实现未读消息小红点显示实例
来源:jb51  时间:2022/2/14 8:34:45  对本文有异议

使用 fragmentLayout 实现,可以把小红点添加到任意 view 上。

效果 添加小红点到 textview 上

在这里插入图片描述

添加小红点到 imageview 上

在这里插入图片描述

代码实现

首先定义一个圆形 drawable

  1. import android.graphics.Canvas;
  2. import android.graphics.ColorFilter;
  3. import android.graphics.Paint;
  4. import android.graphics.PixelFormat;
  5. import android.graphics.drawable.Drawable;
  6. import android.graphics.drawable.ShapeDrawable;
  7.  
  8. import androidx.annotation.IntRange;
  9. import androidx.annotation.NonNull;
  10. import androidx.annotation.Nullable;
  11.  
  12.  
  13. public class CircleDrawable extends ShapeDrawable {
  14. private Paint mPaint;
  15. private int mRadio;
  16.  
  17. public CircleDrawable(int radio, int painColor) {
  18. mPaint = new Paint();
  19. mPaint.setAntiAlias(true);
  20. mPaint.setColor(painColor);
  21. mRadio = radio;
  22. }
  23.  
  24. @Override
  25. public void draw(@NonNull Canvas canvas) {
  26. canvas.drawCircle(mRadio, mRadio, mRadio, mPaint);
  27. }
  28.  
  29. @Override
  30. public void setAlpha(@IntRange(from = 0, to = 255) int i) {
  31. mPaint.setAlpha(i);
  32. }
  33.  
  34. @Override
  35. public void setColorFilter(@Nullable ColorFilter colorFilter) {
  36. mPaint.setColorFilter(colorFilter);
  37. }
  38.  
  39. @Override
  40. public int getOpacity() {
  41. return PixelFormat.TRANSLUCENT;
  42. }
  43.  
  44. /***
  45. * drawable实际宽高,圆形关键
  46. *
  47. * @return
  48. */
  49. @Override
  50. public int getIntrinsicWidth() {
  51. return mRadio * 2;
  52. }
  53.  
  54. @Override
  55. public int getIntrinsicHeight() {
  56. return mRadio * 2;
  57. }
  58. }
  59.  

小红点实现

思路:
一个容器 fragmentLayout 包含两个 view (小红点view + 文本view 「当然也可以是其他的view」),通过 fragmentLayout 添加 view 重叠的特征实现

当前有待优化点:
1、通过 margin 实现小红点可以添加到任意位置「可以是有 layoutparams margin 实现」
2、其他

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Color;
  4. import android.graphics.Rect;
  5. import android.graphics.drawable.ColorDrawable;
  6. import android.graphics.drawable.ShapeDrawable;
  7. import android.graphics.drawable.shapes.OvalShape;
  8. import android.graphics.drawable.shapes.RoundRectShape;
  9. import android.util.AttributeSet;
  10. import android.util.Printer;
  11. import android.view.Gravity;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.widget.FrameLayout;
  15. import android.widget.TextView;
  16.  
  17. import androidx.annotation.Nullable;
  18.  
  19. import com.primer.common.constant.GravityDirection;
  20. import com.primer.common.mvp.LoginInterface;
  21. import com.primer.common.util.LogHelper;
  22. import com.primer.common.util.UiHelper;
  23. import com.primer.common.view.drawable.CircleDrawable;
  24.  
  25. public class BadgeView extends TextView {
  26.  
  27. private final int DEFAULT_BADGE_RADIO = 5;
  28. private final int DEFAULT_TEXT_SIZE = 5;
  29. private final int DEFAULT_TEXT_COLOR = Color.WHITE;
  30. private final int DEFAULT_BADGE_COLOR = Color.RED;
  31. private final int DEFAULT_BADGE_GRAVITY = GravityDirection.DIRECT_TOP_LEFT;
  32.  
  33. private String mText;
  34. private int mBadgeColor = DEFAULT_BADGE_COLOR;
  35. private int mTextColor = DEFAULT_TEXT_COLOR;
  36. private int mTextSize = DEFAULT_TEXT_SIZE;
  37. private int mBadgeRadio = DEFAULT_BADGE_RADIO;
  38. private int mBadgeGravity = DEFAULT_BADGE_GRAVITY;
  39.  
  40. private FrameLayout mFragmentLayout;
  41. private ViewGroup mTargetViewGroup;
  42. private View mTarget;
  43. private Context mContext;
  44.  
  45. public BadgeView(Context context) {
  46. super(context);
  47. init(context);
  48. }
  49.  
  50. public BadgeView(Context context, @Nullable AttributeSet attrs) {
  51. super(context, attrs);
  52. init(context);
  53. }
  54.  
  55. public BadgeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  56. super(context, attrs, defStyleAttr);
  57. init(context);
  58. }
  59.  
  60. public BadgeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  61. super(context, attrs, defStyleAttr, defStyleRes);
  62. init(context);
  63. }
  64.  
  65. private void init(Context context) {
  66. mFragmentLayout = new FrameLayout(context);
  67. mFragmentLayout.setLayoutParams(new FrameLayout.LayoutParams(
  68. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  69. mContext = context;
  70. }
  71.  
  72. /***
  73. *
  74. * @param content
  75. * @param target
  76. * @param textColor
  77. * @param textSize
  78. * @param badgeColor
  79. * @param badgeRadio
  80. */
  81. public void showBadgeView(String content, View target, int textColor, int textSize, int badgeColor, int badgeRadio) {
  82. if (target == null) {
  83. throw new IllegalArgumentException("target view must not be null");
  84. }
  85.  
  86. mTarget = target;
  87. mTargetViewGroup = (ViewGroup) target.getParent();
  88. mTargetViewGroup.removeView(target);
  89. mTargetViewGroup.addView(mFragmentLayout, target.getLayoutParams());
  90.  
  91. setTextColor(mTextColor);
  92. setTextSize(mTextSize);
  93. setGravity(Gravity.CENTER);
  94. if (content != null && content.length() <= 3) {
  95. setText(content);
  96. }
  97.  
  98. //文字和半径之间的适配
  99. if (content != null) {
  100. Rect rect = new Rect();
  101. this.getPaint().getTextBounds(content, 0, content.length(), rect);
  102. if (content.length() <= 3 && rect.width() >= mBadgeRadio) {
  103. mBadgeRadio = (UiHelper.px2dip(mContext, rect.width()) / 2) + 1;
  104. }
  105. }
  106.  
  107. setBackgroundDrawable(getShapeDrawable());
  108. mFragmentLayout.addView(target);
  109. mFragmentLayout.addView(this);
  110. mTargetViewGroup.invalidate();
  111. }
  112.  
  113.  
  114. private ShapeDrawable getShapeDrawable() {
  115. int radio = UiHelper.dip2px(mContext, mBadgeRadio);
  116. CircleDrawable drawable = new CircleDrawable(radio, mBadgeColor);
  117. return drawable;
  118. }
  119.  
  120. /***
  121. *
  122. * @param content
  123. * @param target
  124. */
  125. public void showBadgeView(String content, View target) {
  126. showBadgeView(content, target,
  127. DEFAULT_TEXT_COLOR,
  128. DEFAULT_TEXT_SIZE,
  129. DEFAULT_BADGE_COLOR,
  130. DEFAULT_BADGE_RADIO);
  131. }
  132.  
  133. public void showBadgeView(View target) {
  134. showBadgeView(null, target,
  135. DEFAULT_TEXT_COLOR,
  136. DEFAULT_TEXT_SIZE,
  137. DEFAULT_BADGE_COLOR,
  138. DEFAULT_BADGE_RADIO);
  139. }
  140.  
  141. @Override
  142. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  143. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  144. }
  145.  
  146. @Override
  147. protected void onDraw(Canvas canvas) {
  148. super.onDraw(canvas);
  149. }
  150.  
  151. @Override
  152. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  153. super.onLayout(changed, left, top, right, bottom);
  154. }
  155. }
  156.  

使用

  1. private BadgeView mReadBadgeView;
  2. private TextView mRead;
  3.  
  4. mReadBadgeView = new BadgeView(getActivity());
  5. mReadBadgeView.showBadgeView("+99", mRead);

总结

到此这篇关于Android实现未读消息小红点显示实例的文章就介绍到这了,更多相关Android未读消息小红点内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号