Android常用小红点设计的管理帮助类

此帮助类本意是处理android应用中小红点显示隐藏的管理,但其中并未引用android相关的类,所以应该是适合所有java项目。

1.使用场景:

如下图,v1,v2~v6为相互关联的需要显示小红点的view。其中v1点击后跳转的界面中包含v2,v3,v2点击后跳转的界面中包含v4,v5,v3跳转的界面中包含v6。一般来说,离消息展示最近的在最里层,也就是v4,v5,v6。如果v4,v5其中任何一个亮红,v1,v2必须亮,都不亮红则v1,v2不亮。

Android常用小红点设计的管理帮助类 - 阿里云

2.设计思路:

从最外层到最里层构建一条控制线(对应图A,B,C三条线)。其中每个view包裹一条或多条控制线上(对应图中v2包裹A,B两条控制线,v4包裹A控制线),控制线是否需要亮的信号由最里层view控制(对应图中v4控制A线),只有当一个view包裹的所有控制线都不存在需要亮的信号,此view才允许熄灭小红点,只要有一条线需要亮则此view点亮小红点。

3.上代码:
RedpointManeger.class
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by wangxingsheng on 2017/4/11.
*

* 红点管理
*/
public class RedpointManager {
private static HashMap redpointGroups = new HashMap<>();
private static HashMap redpointRecord = new HashMap<>();
public static void register(RedpointParent redpointParent, int groupId) {
RedpointGroup redpointGroup = null;
if (redpointGroups.containsKey(groupId)) {
redpointGroup = redpointGroups.get(groupId);
} else {
redpointGroup = new RedpointGroup();
}
Redpoint redpoint = redpointWarpper(redpointParent);
redpoint.addGroup(redpointGroup);
redpointGroup.add(redpoint);
redpointGroups.put(groupId, redpointGroup);
}
private static Redpoint redpointWarpper(RedpointParent redpointParent){
if(redpointRecord.containsKey(redpointParent)){
return redpointRecord.get(redpointParent);
}else{
Redpoint redpoint = new Redpoint(redpointParent);
redpointRecord.put(redpointParent,redpoint);
return redpoint;
}
}
public static void notifyGroup(int groupId) {
RedpointGroup group = null;
if (redpointGroups.containsKey(groupId)) {
group = redpointGroups.get(groupId);
group.show();
}else{
group = new RedpointGroup();
redpointGroups.put(groupId, group);
}
}
public static void cancelGroup(int groupId) {
RedpointGroup group = null;
if (redpointGroups.containsKey(groupId)) {
group = redpointGroups.get(groupId);
group.cancel();
}else{
group = new RedpointGroup();
redpointGroups.put(groupId, group);
}
}
public static HashMap getRedpoints() {
return redpointRecord;
}
public interface RedpointParent{
void showPoint();
void hindPoint();
}
private static class Redpoint {
private RedpointParent mRedpointParent;
private boolean statuIsshow;
private ArrayList groups = new ArrayList<>();
private void addGroup(RedpointGroup group){
if(!groups.contains(group)){
groups.add(group);
}
}
public Redpoint(RedpointParent redpointParent){
mRedpointParent = redpointParent;
}
void show() {
statuIsshow = true;
mRedpointParent.showPoint();
}
void hind() {
for (RedpointGroup group:groups){
if(group.statuIsshow){
return;
}
}
mRedpointParent.hindPoint();
statuIsshow = false;
}
@Override
public String toString() {
return "RedPoint "+statuIsshow;
}
}
private static class RedpointGroup {
public boolean statuIsshow;
private ArrayList redpoints = new ArrayList<>();
public void add(Redpoint redpoint) {
if (!redpoints.contains(redpoint)) {
redpoints.add(redpoint);
}
if (statuIsshow){
show();
}else {
cancel();
}
}
public void show() {
statuIsshow = true;
for (Redpoint redpoint : redpoints) {
redpoint.show();
}
}
public void cancel() {
statuIsshow = false;
for (Redpoint redpoint : redpoints) {
redpoint.hind();
}
}
@Override
public String toString() {
return "RedGroup "+statuIsshow +"/n"+redpoints.toString()+"/n";
}
}
}代码使用:

每个view为一个RedpointParent,需要实现此接口,根据具体view显示小红点的方式不同,实现管理小红点的showPoint和hindPoint方法。控制线对应RedpointGroup,存在groupId唯一标识。初始化view时,使用静态方法

register(RedpointParent redpointParent, int groupId)

实现view包裹控制线。使用方法

notifyGroup(int groupId)
cancelGroup(int groupId)

发送控制线是否需要点亮的信号。

值得注意的是:

1.发送信号的方法可以在任何时候调用。

2.register务必在view初始化的时候调用。

本文原地址:https://my.oschina.net/reone/blog/1503425