@@ -49,6 +49,8 @@ public class ZoomPanLayout extends ViewGroup implements
49
49
private int mOffsetY ;
50
50
51
51
private float mEffectiveMinScale = 0 ;
52
+ private float mMinimumScaleX ;
53
+ private float mMinimumScaleY ;
52
54
private boolean mShouldLoopScale = true ;
53
55
54
56
private boolean mIsFlinging ;
@@ -538,9 +540,9 @@ public void scrollTo( int x, int y ) {
538
540
}
539
541
540
542
private void calculateMinimumScaleToFit () {
541
- float minimumScaleX = getWidth () / (float ) mBaseWidth ;
542
- float minimumScaleY = getHeight () / (float ) mBaseHeight ;
543
- float recalculatedMinScale = calculatedMinScale (minimumScaleX , minimumScaleY );
543
+ mMinimumScaleX = getWidth () / (float ) mBaseWidth ;
544
+ mMinimumScaleY = getHeight () / (float ) mBaseHeight ;
545
+ float recalculatedMinScale = calculatedMinScale (mMinimumScaleX , mMinimumScaleY );
544
546
if ( recalculatedMinScale != mEffectiveMinScale ) {
545
547
mEffectiveMinScale = recalculatedMinScale ;
546
548
if ( mScale < mEffectiveMinScale ){
@@ -566,11 +568,32 @@ protected int getHalfHeight() {
566
568
return FloatMathHelper .scale ( getHeight (), 0.5f );
567
569
}
568
570
571
+ /**
572
+ * When the scale is less than {@code mMinimumScaleX}, either because we are using
573
+ * {@link MinimumScaleMode#FIT} or {@link MinimumScaleMode#NONE}, the scroll position takes a
574
+ * value between its starting value and 0. A linear interpolation between the
575
+ * {@code mMinimumScaleX} and the {@code mEffectiveMinScale} is used. <p>
576
+ * This strategy is used to avoid that a custom return value of {@link #getScrollMinX} (which
577
+ * default to 0) become the return value of this method which shifts the whole TileView.
578
+ */
569
579
protected int getConstrainedScrollX ( int x ) {
580
+ if ( mScale < mMinimumScaleX && mEffectiveMinScale != mMinimumScaleX ) {
581
+ float scaleFactor = mScale / ( mMinimumScaleX - mEffectiveMinScale ) +
582
+ mEffectiveMinScale / ( mEffectiveMinScale - mMinimumScaleX );
583
+ return (int ) ( scaleFactor * getScrollX () );
584
+ }
570
585
return Math .max ( getScrollMinX (), Math .min ( x , getScrollLimitX () ) );
571
586
}
572
587
588
+ /**
589
+ * See {@link #getConstrainedScrollX(int)}
590
+ */
573
591
protected int getConstrainedScrollY ( int y ) {
592
+ if ( mScale < mMinimumScaleY && mEffectiveMinScale != mMinimumScaleY ) {
593
+ float scaleFactor = mScale / ( mMinimumScaleY - mEffectiveMinScale ) +
594
+ mEffectiveMinScale / ( mEffectiveMinScale - mMinimumScaleY );
595
+ return (int ) ( scaleFactor * getScrollY () );
596
+ }
574
597
return Math .max ( getScrollMinY (), Math .min ( y , getScrollLimitY () ) );
575
598
}
576
599
0 commit comments