参考http://blog.youkuaiyun.com/sahadev_/article/details/51684998
Android使用责任链模拟事件传递:
1、定义一个接口,用来事件传递
public interface IEvent<T> {
public boolean onEvent(@NonNull T obj);
}
2、定义一个抽象类,实现了事件的拦截和分发public abstract class EventStub1<T> implements IEvent1<T> {
protected IEvent1<T> eventStub;
protected T viewStub;
/**
* @param event1
* 下一个接受的事件
* @param viewStub
* 下一个接受的视图
*/
public EventStub1(IEvent1<T> event1, T viewStub) {
this.eventStub = event1;
this.viewStub = viewStub;
}
@Override
public void onEvent(T obj) {
boolean b = onEventImpl(obj);// 判断事件时候被处理,true表示被消费
if (!b && eventStub != null) {// false的时候事件继续传递
eventStub.onEvent(viewStub);
}
}
/**
* 由子类实现
* @param obj
* @return true 表示处理了事件,false表示将继续传递
*/
public abstract boolean onEventImpl(T obj);// 子类实现
}
3、隐藏视图的实现类,用来处理(View可见)或不处理事件(View不可见)public class HideEventStub extends EventStub1<View> {
public HideEventStub(IEvent1<View> event1, View viewStub) {
super(event1, viewStub);
// TODO Auto-generated constructor stub
}
@Override
public boolean onEventImpl(View obj) {
// TODO Auto-generated method stub
View v = obj;
if (v.getVisibility() == View.VISIBLE) {
v.setVisibility(View.INVISIBLE);
return true;
}
return false;
}
}
5、测试Activity
//字段
EventStub1<View> sourceStub;
EventStub1<View> tempStub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tempStub = new HideEventStub(tempStub, findViewById(R.id.button4));// View消失
tempStub = new HideEventStub(tempStub, findViewById(R.id.imageView1));
tempStub = new HideEventStub(tempStub, findViewById(R.id.button3));
sourceStub = new HideEventStub(tempStub, findViewById(R.id.button2));// 第二个消失
}
//隐式事件点击函数
public void dismiss(View v) {
sourceStub.onEvent(findViewById(R.id.button1));// 第一个消失
布局文件如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.evnetlink.MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="23dp"
android:text="第二个" />
<Button
android:id="@+id/button2"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_below="@+id/button1"
android:text="第三个" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button3"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:src="@drawable/ic_launcher" />
<Button
android:id="@+id/button4"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button2"
android:layout_below="@+id/imageView1"
android:layout_marginTop="16dp"
android:text="左边滑动" />
<Button
android:id="@+id/button5"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button4"
android:layout_below="@+id/button4"
android:layout_marginTop="17dp"
android:text="右边滑动" />
<Button
android:id="@+id/button6"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button5"
android:layout_below="@+id/button5"
android:onClick="dismiss"
android:text="Button" />
<Button
android:id="@+id/button3"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button2"
android:layout_below="@+id/button2"
android:text="第一个" />
</RelativeLayout>