1616import android .view .animation .DecelerateInterpolator ;
1717import android .view .animation .Interpolator ;
1818import android .widget .FrameLayout ;
19+ import android .widget .LinearLayout ;
1920import android .widget .Scroller ;
2021
2122import com .stone .pile .libs .R ;
2223
2324import java .util .ArrayList ;
25+ import java .util .LinkedList ;
2426import java .util .List ;
2527
2628/**
27- * Created by xmuSistone on 2017/5/12. com.stone.pile.libs.PileLayout
2829 * @author uis 2018/10/30
2930 */
3031
@@ -62,6 +63,7 @@ public class StackLayout extends ViewGroup implements ViewTreeObserver.OnGlobalL
6263 private Interpolator interpolator = new DecelerateInterpolator (1.6f );
6364 private StackAdapter adapter ;
6465 private boolean hasSetAdapter = false ;
66+ private LinkedList <View > views = new LinkedList <>();
6567 private FrameLayout animatingView ;
6668 private VelocityTracker mVelocity ;
6769
@@ -109,18 +111,25 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
109111 int realSize = getRealStackSize ();
110112 everyWidth = width - getPaddingLeft () - getPaddingRight () - stackSpace *(realSize -1 ) - 2 *stackEdge ;
111113 everyHeight = height ;
112- originX .add (stackEdge );
114+ // originX.add(stackEdge);
113115 originX .add (stackEdge );
114116 for (int i = 1 ; i < realSize ; i ++){
115- originX .add (originX .get (i ) + stackSpace );
117+ originX .add (originX .get (i - 1 ) + stackSpace );
116118 }
117- originX .add (width );
119+ // originX.add(width);
118120 }
119121 }
120122
123+ boolean isLayout = false ;
124+
121125 @ Override
122126 protected void onLayout (boolean changed , int l , int t , int r , int b ) {
123127 Log .e ("xx" ,"onLayout...." );
128+ if (!hasSetAdapter || isLayout ){
129+ return ;
130+ }
131+ Log .e ("xx" ,"onLayout....again" );
132+ isLayout = true ;
124133 for (int i = 0 , size = getChildCount (); i < size ; i ++) {
125134 View itemView = getChildAt (i );
126135 itemView .measure (everyWidth , everyHeight );
@@ -140,7 +149,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
140149 itemView .setPivotX (pivot );
141150 itemView .setPivotY (everyHeight / 2 );
142151 itemView .layout (left , top , right , bottom );
143- if (i < size - 2 ) {
152+ if (i < size - 1 ) {
144153 adjustScale (i , itemView );
145154 }
146155 }
@@ -150,25 +159,20 @@ private int getRealStackSize(){
150159 return adapter .getItemCount () < stackSize ? adapter .getItemCount () : stackSize ;
151160 }
152161
153- private void initAdapterView (){
154- Log .e ("xx" ,"initAdapterview start...." );
155- if (adapter != null && getChildCount () == 0 && adapter .getItemCount () > 0 ) {
156- hasSetAdapter = true ;
157- for (int i = 0 ,size = getRealStackSize () + 2 ; i < size ; i ++) {
158- FrameLayout frameLayout = new FrameLayout (getContext ());
159- View view = adapter .onCreateView (frameLayout );
160- FrameLayout .LayoutParams lp1 = new FrameLayout .LayoutParams (everyWidth , everyHeight );
161- frameLayout .addView (view , lp1 );
162- addView (frameLayout );
163- }
164-
162+ private void addView (int index ){
163+ Log .e ("xx" ,"addView start...." );
164+ if (adapter != null && adapter .getItemCount () > 0 ){
165+ FrameLayout frameLayout = new FrameLayout (getContext ());
166+ View view = adapter .onCreateView (this );
167+ FrameLayout .LayoutParams params = new FrameLayout .LayoutParams (everyWidth , everyHeight );
168+ frameLayout .addView (view ,params );
169+ addView (frameLayout ,index < 0 ? -1 :index );
165170 }
166171 }
167172
168173 private void adjustScale (int index ,View itemView ) {
169- int rate = getRealStackSize () - ( index <= 1 ? 1 : index ) ;
174+ int rate = getRealStackSize () -1 - index ;
170175 float scale = (float ) Math .pow (1.0f - stackZoom ,rate );
171- itemView .setScaleX (1.0f - stackZoom );
172176 itemView .setScaleY (scale );
173177 }
174178
@@ -190,34 +194,22 @@ public void setAdapter(StackAdapter adapter) {
190194 */
191195 private void doBindAdapter () {
192196 if (adapter != null && !hasSetAdapter ){
193- initAdapterView ();
197+ hasSetAdapter = true ;
198+ for (int i = 0 ,size = getRealStackSize (); i < size ; i ++){
199+ addView (i );
200+ }
194201 doBindAdapterData ();
195202 }
196203 }
197204
198205 private void doBindAdapterData (){
199- int size = getRealStackSize ();
200- FrameLayout frameLayout ;
201- for (int i = 0 ; i < size + 2 ; i ++) {
202- frameLayout = (FrameLayout ) getChildAt (i );
203- adapter .onBindView (frameLayout .getChildAt (0 ),getRealIndex (size ,i ));//size-1-i
204- }
205- }
206-
207- private int getRealIndex (int size ,int index ){
208206 int count = adapter .getItemCount ();
209- int real ;
210- //底层
211- if (0 == index ){
212- real = count > size ? size : 0 ;
213- }//顶层
214- else if (size +1 == index ){
215- real = count - 1 ;
216- }//中间层
217- else {
218- real = size - index ;
207+ int size = getChildCount ();
208+ for (int i = 0 ; i < size ; i ++) {
209+ View view = getChildAt (i );
210+ adapter .onBindView (view ,size -1 -i );//size-1-i
211+
219212 }
220- return real ;
221213 }
222214
223215 @ Override
@@ -296,9 +288,17 @@ private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept)
296288
297289 public void computeScroll (int dx ) {
298290 //dx<0 left, dx>0 right
299- for (int i = 3 , size = 2 + getRealStackSize () ; i < size ; i ++) {
291+ for (int size = getChildCount (), i = size - 1 ; i < size ; i ++) {
300292 View itemView = getChildAt (i );
301293 itemView .setTranslationX (itemView .getTranslationX () + dx );
294+ if (size == 3 ) {
295+ Log .e ("cc" ,"remove..." );
296+ removeViewAt (0 );
297+ }else if (size == 2 ){
298+ isLayout = false ;
299+ addView (2 );
300+ }
301+
302302 }
303303 }
304304
0 commit comments