Android QQ通知小红点


一、先上图:

Android QQ通知小红点_第1张图片

二、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();

你可能感兴趣的:(Android QQ通知小红点)