一、先上图:
二、RedPointView代码:
package com.xiaobai.mizar.android.ui.view.common; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.RoundRectShape; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import com.xiaobai.mizar.android.ui.view.widget.XbTextView; import com.xiaobai.mizar.utils.LayoutParamsUtils; /** * Author: walid * Date : 2016/4/9 11:25 */ public class RedPointView extends XbTextView { private static final int DEFAULT_MARGIN_PX = 2; // 显示未读条数 private int count = 0; // 背景颜色 private int colBg = Color.RED; // 内容颜色 private int colCount = Color.WHITE; // 显示左右位置 private int gravityHorizontal = Gravity.END; // 显示上下位置 private int gravityVertical = Gravity.TOP; // 显示大小 private int countPx = 15; // 背景大小 private int countBgPx = (int) (countPx * 1.5); // 是否显示 private boolean show; private Context context; private View orginView; public RedPointView(Context context) { super(context); } public RedPointView(Context context, View target) { super(context); setGravity(Gravity.CENTER); this.context = context; this.orginView = target; } public void init() { if (count > 0) { setText(String.valueOf(count)); } setTextColor(colCount); setTextSize(TypedValue.COMPLEX_UNIT_PX, countPx); setPositionParams(gravityHorizontal, gravityVertical); setBackgroundDrawable(getDefaultBackground()); show = true; if (orginView != null) { restartDraw(orginView); } } // 将target从父view中去掉,取而代之为一个包含target和point的framLayout private void restartDraw(View target) { LayoutParams lp = target.getLayoutParams(); ViewParent parent = target.getParent(); FrameLayout framLayout = new FrameLayout(context); ViewGroup viewGroup = (ViewGroup) parent; int index = viewGroup.indexOfChild(target); viewGroup.removeView(target); viewGroup.addView(framLayout, index, lp); framLayout.addView(target); framLayout.addView(this); viewGroup.invalidate(); } /** * Fuction: 设置未读条数 */ public void setCount(int count) { this.count = count; } /** * Fuction: 设置内容字体颜色 */ public void setColCount(int colCount) { this.colCount = colCount; } /** * Fuction: 设置背景颜色 */ public void setColBg(int colBg) { this.colBg = colBg; } /** * Fuction: 设置显示位置 */ public void setPosition(int gravityHorizontal, int gravityVertical) { this.gravityHorizontal = gravityHorizontal; this.gravityVertical = gravityVertical; } /** * Fuction: 设置内容字体大小 */ public void setCountPx(int countPx) { this.countPx = countPx; this.countBgPx = (int) (countPx * 1.5); } public void show() { if (getVisibility() == View.VISIBLE) { return; } this.setVisibility(View.VISIBLE); show = true; } public void hide() { if (getVisibility() == View.GONE) { return; } this.setVisibility(View.GONE); show = false; } // 画一个背景 private ShapeDrawable getDefaultBackground() { int r = countBgPx; float[] outerR = new float[]{r, r, r, r, r, r, r, r}; RoundRectShape rectShape = new RoundRectShape(outerR, null, null); ShapeDrawable shap = new ShapeDrawable(rectShape); shap.setIntrinsicWidth(r); shap.setIntrinsicHeight(r); shap.getPaint().setColor(colBg); return shap; } // 设置显示位置参数 private void setPositionParams(int gravityHorizontal, int gravityVertical) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = gravityHorizontal | gravityVertical; int pointMarginPx = LayoutParamsUtils.templateTransSize2Current(DEFAULT_MARGIN_PX); switch (gravityHorizontal) { case Gravity.START: switch (gravityVertical) { case Gravity.TOP: params.setMargins(pointMarginPx, pointMarginPx, 0, 0); break; case Gravity.BOTTOM: params.setMargins(pointMarginPx, 0, 0, pointMarginPx); default: break; } case Gravity.END: switch (gravityVertical) { case Gravity.TOP: params.setMargins(0, pointMarginPx, pointMarginPx, 0); break; case Gravity.BOTTOM: params.setMargins(0, 0, pointMarginPx, pointMarginPx); default: break; } break; default: break; } setLayoutParams(params); } public boolean isShow() { return show; } public void setShow(boolean show) { this.show = show; } }
redPointView = new RedPointView(getContext(), ivMessage); redPointView.setCount(1); redPointView.init();