|  |  |  | @ -13,10 +13,9 @@ import android.view.animation.DecelerateInterpolator; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import com.android.base.R; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import timber.log.Timber; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * usage: | 
			
		
	
		
			
				
					|  |  |  |  |  * <pre> | 
			
		
	
		
			
				
					|  |  |  |  |  *     {@code | 
			
		
	
		
			
				
					|  |  |  |  |  *     <com.android.base.widget.pulltozoom.PullToZoomScrollView | 
			
		
	
	
		
			
				
					|  |  |  | @ -94,8 +93,10 @@ public class PullToZoomScrollView extends NestedScrollView { | 
			
		
	
		
			
				
					|  |  |  |  |         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PullToZoomScrollView); | 
			
		
	
		
			
				
					|  |  |  |  |         mZoomViewId = typedArray.getResourceId(R.styleable.PullToZoomScrollView_psv_zoom_view, -1); | 
			
		
	
		
			
				
					|  |  |  |  |         mContainerViewId = typedArray.getResourceId(R.styleable.PullToZoomScrollView_psv_header_view, -1); | 
			
		
	
		
			
				
					|  |  |  |  |         mDamp = typedArray.getInteger(R.styleable.PullToZoomScrollView_psv_damp, 2);//默认阻尼2
 | 
			
		
	
		
			
				
					|  |  |  |  |         mMaxZoomHeight = typedArray.getInteger(R.styleable.PullToZoomScrollView_psv_max_over, dpToPx(1500));//默认最大scroll 1500DP
 | 
			
		
	
		
			
				
					|  |  |  |  |         //默认阻尼2
 | 
			
		
	
		
			
				
					|  |  |  |  |         mDamp = typedArray.getInteger(R.styleable.PullToZoomScrollView_psv_damp, 2); | 
			
		
	
		
			
				
					|  |  |  |  |         //默认最大scroll 1500DP
 | 
			
		
	
		
			
				
					|  |  |  |  |         mMaxZoomHeight = typedArray.getInteger(R.styleable.PullToZoomScrollView_psv_max_over, dpToPx(1500)); | 
			
		
	
		
			
				
					|  |  |  |  |         mZoomFactory = typedArray.getFloat(R.styleable.PullToZoomScrollView_psv_zoom_factory, 2.0F); | 
			
		
	
		
			
				
					|  |  |  |  |         typedArray.recycle(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -126,8 +127,8 @@ public class PullToZoomScrollView extends NestedScrollView { | 
			
		
	
		
			
				
					|  |  |  |  |         getInnerViewHeight(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private boolean hasInnerView() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mContainerView != null && mZoomView != null; | 
			
		
	
		
			
				
					|  |  |  |  |     private boolean innerViewInitialized() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mContainerView != null && mZoomView != null && mOriginContainerViewHeight != 0 && mOriginZoomViewHeight != 0; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     @Override | 
			
		
	
	
		
			
				
					|  |  |  | @ -145,22 +146,19 @@ public class PullToZoomScrollView extends NestedScrollView { | 
			
		
	
		
			
				
					|  |  |  |  |     private boolean processOverScrollBy(int deltaX, int deltaY, int scrollX, | 
			
		
	
		
			
				
					|  |  |  |  |                                         int scrollY, int scrollRangeX, int scrollRangeY, | 
			
		
	
		
			
				
					|  |  |  |  |                                         int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!hasInnerView()) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!innerViewInitialized()) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (mContainerView.getHeight() <= mMaxZoomHeight && isTouchEvent) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (deltaY < 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 int offset = (int) (deltaY * 1.0F / mDamp); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mContainerView.getHeight() - offset >= mOriginContainerViewHeight) { | 
			
		
	
		
			
				
					|  |  |  |  |                     int height = mContainerView | 
			
		
	
		
			
				
					|  |  |  |  |                             .getHeight() - offset < mMaxZoomHeight ? | 
			
		
	
		
			
				
					|  |  |  |  |                             mContainerView.getHeight() - offset : mMaxZoomHeight; | 
			
		
	
		
			
				
					|  |  |  |  |                     int height = mContainerView.getHeight() - offset < mMaxZoomHeight ? mContainerView.getHeight() - offset : mMaxZoomHeight; | 
			
		
	
		
			
				
					|  |  |  |  |                     setContainerHeight(height); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mContainerView.getHeight() > mOriginContainerViewHeight) { | 
			
		
	
		
			
				
					|  |  |  |  |                     int height = mContainerView.getHeight() - deltaY > mOriginContainerViewHeight ? | 
			
		
	
		
			
				
					|  |  |  |  |                             mContainerView.getHeight() - deltaY : mOriginContainerViewHeight; | 
			
		
	
		
			
				
					|  |  |  |  |                     int height = mContainerView.getHeight() - deltaY > mOriginContainerViewHeight ? mContainerView.getHeight() - deltaY : mOriginContainerViewHeight; | 
			
		
	
		
			
				
					|  |  |  |  |                     setContainerHeight(height); | 
			
		
	
		
			
				
					|  |  |  |  |                     return true; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
	
		
			
				
					|  |  |  | @ -172,7 +170,7 @@ public class PullToZoomScrollView extends NestedScrollView { | 
			
		
	
		
			
				
					|  |  |  |  |     @SuppressLint("ClickableViewAccessibility") | 
			
		
	
		
			
				
					|  |  |  |  |     @Override | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean onTouchEvent(MotionEvent ev) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (hasInnerView()) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (innerViewInitialized()) { | 
			
		
	
		
			
				
					|  |  |  |  |             int action = ev.getAction(); | 
			
		
	
		
			
				
					|  |  |  |  |             if (action == MotionEvent.ACTION_DOWN) { | 
			
		
	
		
			
				
					|  |  |  |  |                 cancelAnim(); | 
			
		
	
	
		
			
				
					|  |  |  | @ -231,9 +229,8 @@ public class PullToZoomScrollView extends NestedScrollView { | 
			
		
	
		
			
				
					|  |  |  |  |         mZoomView.setPivotY(mOriginContainerViewHeight / 3F); | 
			
		
	
		
			
				
					|  |  |  |  |         float addOffset = (height - mOriginContainerViewHeight) * mZoomFactory / mOriginContainerViewHeight; | 
			
		
	
		
			
				
					|  |  |  |  |         float scale = height * 1.0F / mOriginContainerViewHeight + addOffset; | 
			
		
	
		
			
				
					|  |  |  |  |         Timber.d("scale = %f", scale); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!Float.isInfinite(scale) && !Float.isNaN(scale)) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!Float.isInfinite(scale) && !Float.isNaN(scale) && scale >= 1F) { | 
			
		
	
		
			
				
					|  |  |  |  |             mZoomView.setScaleX(scale); | 
			
		
	
		
			
				
					|  |  |  |  |             mZoomView.setScaleY(scale); | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |