纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 support v4 包 SlidingPaneLayout 控件更加 Q 迷你,累计代码不足 300 行),支持上下左右有各种侧拉,可配置侧拉松手临界距离,支持单独使用、ListView、GridView、RecycleView、ScrollView、ViewPager 等各种嵌套(作为 item 使用或者作为以上所有控件的父容器使用),具体不同配置展示效果如下图。
like SlidingPaneLayout, all direction support.
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;
/**
* like SlidingPaneLayout, all direction support.
*/
public class SlideLayout extends ViewGroup {
public static final int STATE_CLOSE = 0;
public static final int STATE_SLIDING = 1;
public static final int STATE_OPEN = 2;
private static final int SLIDE_RIGHT = 0;
private static final int SLIDE_LEFT = 1;
private static final int SLIDE_TOP = 2;
private static final int SLIDE_BOTTOM = 3;
private View mContentView;
private View mSlideView;
private Scroller mScroller;
private int mLastX = 0;
private int mLastY = 0;
private int mSlideCriticalValue = 0;
private boolean mIsScrolling = false;
private int mSlideDirection;
public SlideLayout(Context context) {
this(context, null);
}
public SlideLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlideLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SlideLayout);
mSlideDirection = typedArray.getInt(R.styleable.SlideLayout_slideDirection, SLIDE_RIGHT);
mSlideCriticalValue = typedArray.getDimensionPixelSize(R.styleable.SlideLayout_slideCriticalValue, 0);
typedArray.recycle();
mScroller = new Scroller(context);
}
public int getSlideState() {
int retValue = STATE_CLOSE;
if (mIsScrolling) {
retValue = STATE_SLIDING;
} else {
int scrollOffset = (mSlideDirection == SLIDE_LEFT || mSlideDirection == SLIDE_RIGHT) ?
getScrollX() : getScrollY();
retValue = (scrollOffset == 0) ? STATE_CLOSE : STATE_OPEN;
}
return retValue;
}
public void smoothCloseSlide() {
smoothScrollTo(0, 0);
}
public void smoothOpenSlide() {
switch (mSlideDirection) {
case SLIDE_RIGHT:
smoothScrollTo(mSlideView.getMeasuredWidth(), 0);
break;
case SLIDE_LEFT:
smoothScrollTo(-mSlideView.getMeasuredWidth(), 0);
break;
case SLIDE_TOP:
smoothScrollTo(0, -mSlideView.getMeasuredHeight());
break;
case SLIDE_BOTTOM:
smoothScrollTo(0, mSlideView.getMeasuredHeight());
break;
}
}
@Override
protected void onFinishInflate() {
s