@@ -127,14 +127,13 @@ void layoutChild(){
127127 }
128128 view .setPivotX (pivot );
129129 view .setPivotY (everyHeight /2f );
130- if (mAnimator .isRunning () && i > 0 ){
131-
132- }else {
133- view .layout (left , top , right , bottom );
134- view .setScaleY ((float ) Math .pow (layout .stackZoomY ,stackSize -1 -i ));
130+ if (!mAnimator .isRunning () || 0 == i ){
131+ float scale = (float ) Math .pow (layout .stackZoomY ,stackSize -1 -i );
132+ view .setScaleY (scale );
135133 view .setTranslationX (0 );
134+ view .layout (left , top , right , bottom );
136135 }
137- }else if (!isTopRemove ){//顶层加入
136+ }else if (!isTopRemove && ! mAnimator . isRunning () ){//顶层加入
138137 if (layout .stackEdgeModel == MODEL_LEFT ) {
139138 left = layout .getWidth () - layout .stackEdge ;
140139 right = everyWidth + left ;
@@ -191,6 +190,8 @@ private View getStackView(){
191190 item = weakViews .removeLast ();
192191 view = item .get ();
193192 if (view != null ){
193+ view .setTranslationX (0 );
194+ view .setScaleY (1f );
194195 break ;
195196 }
196197 }
@@ -205,8 +206,6 @@ private View getStackView(){
205206 private void removeStackView (View view ){
206207 if (view != null && layout != null ) {
207208 layout .removeView (view );
208- view .setTranslationX (0 );
209- view .setScaleY (1f );
210209 weakViews .add (new WeakReference <>(view ));
211210 }
212211 }
@@ -227,7 +226,7 @@ boolean canScroll(float downX, float downY, float x, float y){
227226 // 垂直滑动
228227 }
229228 }
230- return enableScroll ;
229+ return enableScroll && ! mAnimator . isRunning () ;
231230 }
232231
233232 void fingerTouchDown (){
@@ -261,19 +260,23 @@ void executeScroll(int dx) {
261260 }
262261
263262 void scaleTransChild (int dx ){
264- int first = layout .getChildCount ()>layout .stackSize ? 1 : 0 ;
265- int size = layout .getChildCount ()-1 ;
266- int stackSize = layout .stackSize ;
267- for (int i = first ; i <size ; i ++){
263+ int cnt = layout .getChildCount ();
264+ int stackSize = layout .getRealStackSize ();
265+ int size = Math .min (cnt ,stackSize )-(cnt ==stackSize ? 1 :0 );
266+ int first = cnt > stackSize ? 1 : 0 ;
267+ int index = 0 ;
268+ for (int i = first ; i < size ; i ++) {
268269 View v = layout .getChildAt (i );
269270 int sign = MODEL_LEFT == layout .stackEdgeModel ? 1 : -1 ;
270- float rate = 1f *dx /layout .getWidth ();
271- int tx = originX .get (i -first +1 )-originX .get (i -first );
272- v .setTranslationX (v .getTranslationX () + rate *tx );
273-
274- double scaley = Math .pow (layout .stackZoomY ,stackSize -2 -i );
275- double scale = Math .pow (layout .stackZoomY ,stackSize -1 -i );
276- v .setScaleY (v .getScaleY ()+(float )(sign *rate *(scaley -scale )));
271+ float rate = 1f * dx / layout .getWidth ();
272+ int indexX = index ;
273+ int tx = originX .get ( indexX +1 ) - originX .get (indexX );
274+ v .setTranslationX (v .getTranslationX () + rate * tx );
275+ int indexY = size - index ;
276+ double scaley = Math .pow (layout .stackZoomY , indexY - 1 );
277+ double scale = Math .pow (layout .stackZoomY , indexY );
278+ v .setScaleY (v .getScaleY () + (float ) (sign * rate * (scaley - scale )));
279+ index ++;
277280 }
278281 }
279282
@@ -340,8 +343,8 @@ private void addBottomView(){
340343 int index = (stackSize - 1 + displayPosition ) % cnt ;
341344 View view = getStackView ();
342345 layout .getAdapter ().onBindView (view , index );
343- needRelayout = true ;
344346 layout .addView (view , 0 );
347+ needRelayout = true ;
345348 layout .getAdapter ().onItemDisplay (displayPosition );
346349 }
347350
@@ -354,8 +357,8 @@ private View addTopView(){
354357 }
355358 View view = getStackView ();
356359 layout .getAdapter ().onBindView (view , position );
357- needRelayout = true ;
358360 layout .addView (view );
361+ needRelayout = true ;
359362 return view ;
360363 }
361364
@@ -366,7 +369,6 @@ private void removeBottomView(){
366369 if (displayPosition < 0 ){
367370 displayPosition += cnt ;
368371 }
369- //needRelayout = true;
370372 View view = layout .getChildAt (0 );
371373 removeStackView (view );
372374 layout .getAdapter ().onItemDisplay (displayPosition );
@@ -381,9 +383,8 @@ public void onAnimationUpdate(ValueAnimator animation) {
381383 scaleTransChild ((int )(mAnimator .getTranslationX ()-lastValue ));
382384 if (fraction >= 1.0f ) {
383385 mAnimator .endAnimator (this );
384- needRelayout = true ;
385386 layout .requestLayout ();
386-
387+ needRelayout = true ;
387388 } else if (fraction > 0.2 && mAnimator .needAddBottomView ()){
388389 addBottomView ();
389390 }
@@ -437,13 +438,15 @@ void setTranslationX(float value){
437438 }
438439
439440 void startAnimator (boolean needRemoveTop ,boolean needAddBottom ,float transX , ValueAnimator .AnimatorUpdateListener listener ){
440- int mills = needAddBottom ? duration : (int )(1.2 *duration *Math .abs (transX )/mWidth );
441- needAddBottomView = needAddBottom ;
442- needRemoveTopView = needRemoveTop ;
443- animator = ValueAnimator .ofFloat (0f , transX ).setDuration (mills );
444- animator .setInterpolator (needAddBottom ? interpolatorAuto : interpolator );
445- animator .addUpdateListener (listener );
446- animator .start ();
441+ if (animator == null ) {
442+ int mills = needAddBottom ? duration : (int ) (1.2 * duration * Math .abs (transX ) / mWidth );
443+ needAddBottomView = needAddBottom ;
444+ needRemoveTopView = needRemoveTop ;
445+ animator = ValueAnimator .ofFloat (0f , transX ).setDuration (mills );
446+ animator .setInterpolator (needAddBottom ? interpolatorAuto : interpolator );
447+ animator .addUpdateListener (listener );
448+ animator .start ();
449+ }
447450 }
448451
449452 void cancelAnimator (){
0 commit comments