主要控制滑动事件的分配(仅支持listview,pulltorefreshlist和ScrollView)
public class StickyNavLayout extends LinearLayout implements NestedScrollingParent
{
private static final String TAG = "StickyNavLayout" ;
@Override
public boolean onStartNestedScroll (View child, View target, int nestedScrollAxes)
{
Log.e (TAG , "onStartNestedScroll" );
return true;
}
@Override
public void onNestedScrollAccepted (View child, View target, int nestedScrollAxes)
{
Log.e (TAG , "onNestedScrollAccepted" );
}
@Override
public void onStopNestedScroll (View target)
{
Log.e (TAG , "onStopNestedScroll" );
}
@Override
public void onNestedScroll (View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed)
{
Log.e (TAG , "onNestedScroll" );
}
@Override
public void onNestedPreScroll (View target, int dx, int dy, int [] consumed)
{
Log.e (TAG , "onNestedPreScroll" );
boolean hiddenTop = dy > 0 && getScrollY() < mTopViewHeight ;
boolean showTop = dy < 0 && getScrollY() >= 0 && !ViewCompat.canScrollVertically (target, -1 );
if (hiddenTop || showTop)
{
scrollBy(0 , dy);
consumed[1 ] = dy;
}
}
@Override
public boolean onNestedFling (View target, float velocityX, float velocityY, boolean consumed)
{
Log.e (TAG , "onNestedFling" );
return false;
}
@Override
public boolean onNestedPreFling (View target, float velocityX, float velocityY)
{
Log.e (TAG , "onNestedPreFling" );
//down - //up+
if (getScrollY() >= mTopViewHeight ) return false;
fling((int ) velocityY);
return true;
}
@Override
public int getNestedScrollAxes ()
{
Log.e (TAG , "getNestedScrollAxes" );
return 0 ;
}
private View mTop ;
private View mNav ;
private ViewPager mViewPager ;
private int mTopViewHeight ;
private OverScroller mScroller ;
private VelocityTracker mVelocityTracker ;
private int mTouchSlop ;
private int mMaximumVelocity , mMinimumVelocity ;
private float mLastY ;
private boolean mDragging ;
public StickyNavLayout (Context context, AttributeSet attrs)
{
super (context, attrs);
setOrientation(LinearLayout.VERTICAL );
mScroller = new OverScroller(context);
mTouchSlop = ViewConfiguration.get (context).getScaledTouchSlop();
mMaximumVelocity = ViewConfiguration.get (context)
.getScaledMaximumFlingVelocity();
mMinimumVelocity = ViewConfiguration.get (context)
.getScaledMinimumFlingVelocity();
}
private void initVelocityTrackerIfNotExists ()
{
if (mVelocityTracke