这个库本身并没有很难, 但是它在交互方面的思想是超前的, 虽然现在我们对滑动返回已经习惯了, 但是在当时还是很新鲜的交互方式.
如果要我实现滑动返回, 我第一个看的一定是DrawerLayout的实现, 它用了ViewDragHelper.
接下来我们结合源码解析SwipeBackLayout是如何做到让我们能使用滑动返回的手势的.
SwipeBackActivity
用过的都知道, 想让一个activity具有滑动返回的手势, 需要让它继承SwipeBackActivity.
public class SwipeBackActivity extends FragmentActivity implements SwipeBackActivityBase
SwipeBackActivity继承FragmentActivity, 其实就相当于在正常的继承关系之间插了它自己进去.
至于SwipeBackActivityBase则是一个定义好的接口, 在SwipeBackActivity中实现
public interface SwipeBackActivityBase {
/**
* @return the SwipeBackLayout associated with this activity.
*/
public abstract SwipeBackLayout getSwipeBackLayout();
public abstract void setSwipeBackEnable(boolean enable);
/**
* Scroll out contentView and finish the activity
*/
public abstract void scrollToFinishActivity();
}
这个些个方法在SwipeBackActivity里面都重写了, 都很简单, 没必要说, 我们看看它重写的其他三个方法
private SwipeBackActivityHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new SwipeBackActivityHelper(this);
mHelper.onActivityCreate();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mHelper.onPostCreate();
}
@Override
public View findViewById(int id) {
View v = super.findViewById(id);
if (v == null && mHelper != null)
return mHelper.findViewById(id);
return v;
}
findViewById
就是先调用super.findViewById
, 没找到的情况下, 再到mHelper
中找. 至于mHelper
是什么, 等会儿再说, 先看其他两个方法.
其他两个方法相当于在activity的两个生命周期里面执行了mHelper
的两个函数, 那么mHelper
到底是什么呢, 我们看看SwipeBackActivityHelper
SwipeBackActivityHelper
首先看它的构造函数和成员变量
private Activity mActivity;
private SwipeBackLayout mSwipeBackLayout;
public SwipeBackActivityHelper(Activity activity) {
mActivity = activity;
}
原来构造它的时候, 它立刻将构造它的activity的引用保存了起啦, 我们怀疑和它的两个类似生命周期的方法有关.
先看onActivityCreate
public void onActivityCreate() {
mActivity.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mActivity.getWindow().getDecorView().setBackgroundDrawable(null);
mSwipeBackLayout = (SwipeBackLayout) LayoutInflater.from(mActivity).inflate(
me.imid.swipebacklayout.lib.R.layout.swipeback_layout, null);
mSwipeBackLayout.addSwipeListener(new SwipeBackLayout.SwipeListener() {
@Override
public void onScrollStateChange(int state, float scrollPercent) {
if (state == SwipeBackLayout.STATE_IDLE && scrollPercent == 0) {
Utils.convertActivityFromTranslucent(mActivity);
}
}
@Override
public void onEdgeTouch(int edgeFlag) {
Utils.convertActivityToTranslucent(mActivity);
}
@Override
public void onScrollOverThreshold() {