package com.think.tlr; import android.content.Context; import android.os.Bundle; import android.support.v4.view.NestedScrollingParent; import android.support.v4.view.NestedScrollingParentHelper; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * @author borney * @date 4/28/17 * @see TLRLinearLayout */ public class TLRNestedLinearLayout extends TLRLinearLayout implements NestedScrollingParent { private TLRCalculator mCalculator; private NestedScrollingParentHelper mParentHelper; public TLRNestedLinearLayout(Context context) { this(context, null); } public TLRNestedLinearLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TLRNestedLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mCalculator = calculator(); mParentHelper = new NestedScrollingParentHelper(this); ViewCompat.setNestedScrollingEnabled(this, true); } @Override public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { if (!isEnableLoad() && !isEnableRefresh()) { return false; } if (mCalculator.hasAnyAnimatorRunning()) { return false; } return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; } @Override public void onNestedScrollAccepted(View child, View target, int axes) { mParentHelper.onNestedScrollAccepted(child, target, axes); } @Override public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { setTouchView(target); mCalculator.touchMoveLayoutView((int) (-dyUnconsumed / getResistance())); } @Override public void onStopNestedScroll(View child) { mParentHelper.onStopNestedScroll(child); mCalculator.eventUp(0, 0); } @Override public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle args) { return super.onNestedPrePerformAccessibilityAction(target, action, args); } @Override public int getNestedScrollAxes() { return mParentHelper.getNestedScrollAxes(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); if (action == MotionEvent.ACTION_DOWN) { return dispatchTouchEvent(false, ev); } if (action == MotionEvent.ACTION_MOVE && !mCalculator.isBackStatus()) { return dispatchTouchEvent(false, ev); } return dispatchTouchEvent(true, ev); } }