Skip to content

Commit d68b49a

Browse files
committed
fix
1 parent 9e7cbec commit d68b49a

4 files changed

Lines changed: 33 additions & 32 deletions

File tree

cardstackview/src/main/java/me/brucezz/cardstackview/CardFactory.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,8 @@ public class CardFactory {
1818

1919
private Options mOptions;
2020

21-
public CardFactory(Options options) {
21+
public CardFactory(ViewGroup parent, Options options) {
2222
mOptions = options;
23-
}
24-
25-
public void init(ViewGroup parent) {
26-
mCardHolders.clear();
2723
for (int i = 0; i < parent.getChildCount(); i++) {
2824
mCardHolders.add(new CardHolder(parent, parent.getChildAt(i), i, mOptions));
2925
}
@@ -68,12 +64,12 @@ public CardHolder findByTouch(float touchY) {
6864
if (mCardHolders.size() == 0) return null;
6965

7066
int index;
71-
int last = mCardHolders.size() - 1;
72-
CardHolder lastHolder = mCardHolders.get(last);
73-
if (touchY > lastHolder.getFixedBottom()) {
67+
int count = mCardHolders.size() - 1;
68+
int span = count * mOptions.CARD_SPAN_CURRENT;
69+
if (touchY > span + mOptions.CARD_HEIGHT) {
7470
return null;
75-
} else if (touchY > last * mOptions.CARD_SPAN_CURRENT) {
76-
index = last;
71+
} else if (touchY > span) {
72+
index = count;
7773
} else {
7874
index = (int) Math.floor(touchY / mOptions.CARD_SPAN_CURRENT);
7975
}

cardstackview/src/main/java/me/brucezz/cardstackview/CardHolder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package me.brucezz.cardstackview;
22

33
import android.animation.ValueAnimator;
4-
import android.util.Log;
54
import android.view.View;
65
import android.view.ViewGroup;
76
import android.view.animation.OvershootInterpolator;
@@ -58,7 +57,7 @@ public int getFixedLeft() {
5857
}
5958

6059
public int getFixedRight() {
61-
return mParent.getWidth() - mParent.getPaddingRight();
60+
return getFixedLeft() + mView.getMeasuredWidth();
6261
}
6362

6463
public int getFixedTop() {
@@ -169,7 +168,7 @@ public void onSwap(final CardHolder dragging) {
169168
/**
170169
* 判断是否在执行动画
171170
*/
172-
private boolean isAnimating() {
171+
public boolean isAnimating() {
173172
return mRunningAnimator != null && mRunningAnimator.isRunning();
174173
}
175174

cardstackview/src/main/java/me/brucezz/cardstackview/CardStackView.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,17 @@ public CardStackView(Context context, AttributeSet attrs, int defStyleAttr) {
5858
}
5959

6060
private void initViews() {
61+
mOptions = new Options();
62+
6163
for (int i = 0; i < mCardAdapter.getItemCount(); i++) {
6264
addView(mCardAdapter.getView(null, i, this));
6365
}
64-
mOptions = new Options();
66+
67+
mSlidingResistanceCalculator = new SlidingResistanceCalculator(2000f, mOptions.CARD_SPAN_OFFSET);
6568

6669
updateOptions();
6770

68-
mCardFactory = new CardFactory(mOptions);
69-
mCardFactory.init(this);
70-
mSlidingResistanceCalculator = new SlidingResistanceCalculator(2000f, mOptions.CARD_SPAN_OFFSET);
71+
mCardFactory = new CardFactory(this, mOptions);
7172
//Log.d(TAG, "init: " + mCardAdapter.getItemCount());
7273
}
7374

@@ -169,7 +170,7 @@ public void onLongPress(MotionEvent e) {
169170
@Override
170171
public boolean onSingleTapUp(MotionEvent e) {
171172

172-
CardHolder touch = mCardFactory.findByTouch(e.getY() - getPaddingTop());
173+
final CardHolder touch = mCardFactory.findByTouch(e.getY() - getPaddingTop());
173174
if (touch != null && mOnCardClickListener != null) {
174175
mOnCardClickListener.onClick(touch.mView, touch.mRealIndex, touch.mChildIndex);
175176
}
@@ -183,12 +184,14 @@ public boolean onSingleTapUp(MotionEvent e) {
183184
* 计算一些常量值
184185
*/
185186
private void updateOptions() {
186-
mOptions.SCREEN_WIDTH = Util.getScreenWidthPixel(getContext());
187+
int parentH = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
188+
int parentW = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
189+
190+
// TODO: 2016/10/31 后面提供相关属性,不通过 adapter 提供
187191
mOptions.CARD_HEIGHT = mCardAdapter.getCardHeight();
188-
mOptions.CARD_WIDTH = mOptions.SCREEN_WIDTH - getPaddingLeft() - getPaddingRight();
192+
mOptions.CARD_WIDTH = parentW;
189193

190194
mOptions.CARD_SPAN_NORMAL_MIN = mCardAdapter.getMinCardSpan();
191-
int parentH = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
192195
int span = (parentH - mOptions.CARD_HEIGHT) / (mCardAdapter.getItemCount() - 1);
193196
mOptions.CARD_SPAN_NORMAL = Math.max(span, mOptions.CARD_SPAN_NORMAL_MIN);
194197

@@ -241,7 +244,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
241244
// wrap_content use min span
242245
if (existsValidChild()) {
243246
width = maxWidth;
244-
height = mOptions.CARD_SPAN_NORMAL_MIN * (mCardFactory.size() - 1) + mOptions.CARD_HEIGHT;
247+
height = mOptions.CARD_SPAN_NORMAL_MIN * (getChildCount() - 1) + mOptions.CARD_HEIGHT;
245248
}
246249
width += (getPaddingLeft() + getPaddingRight());
247250
height += (getPaddingTop() + getPaddingBottom());
@@ -269,11 +272,14 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto
269272
/**
270273
* 更新卡片位置
271274
*/
272-
private void updateCardPosition() {
275+
public void updateCardPosition() {
273276
if (!existsValidChild()) return;
274277

275278
for (int i = 0; i < mCardFactory.size(); i++) {
276-
mCardFactory.get(i).layoutFixed();
279+
CardHolder holder = mCardFactory.get(i);
280+
//if (!holder.isAnimating()) {
281+
holder.layoutFixed();
282+
//}
277283
}
278284
}
279285

@@ -328,9 +334,6 @@ public interface OnPositionChangedListener {
328334
void onPositionChanged(List<Integer> position);
329335
}
330336

331-
332-
333-
334337
private class CardStackViewDataObserver extends DataSetObserver {
335338
@Override
336339
public void onChanged() {

cardstackview/src/main/java/me/brucezz/cardstackview/Options.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@
77
*/
88

99
public class Options {
10-
/**
11-
* 屏幕宽度,跟计算 Card 宽度有关
12-
*/
13-
public int SCREEN_WIDTH;
1410
/**
1511
* 卡片当前绘制的间距
1612
*/
@@ -68,11 +64,18 @@ public class Options {
6864
* 卡片间距重置动画时长
6965
*/
7066
public long SPAN_RESET_DURATION = 300L;
67+
/**
68+
* 点击卡片之后移除其他卡片
69+
*/
70+
public boolean CLICK_TO_SEPARATE = true;
71+
/**
72+
* 移出屏幕的动画时长
73+
*/
74+
public long CARD_SLIP_OUT = 500L;
7175

7276
@Override
7377
public String toString() {
7478
return "Options{" +
75-
"\nSCREEN_WIDTH=" + SCREEN_WIDTH +
7679
", \nCARD_SPAN_CURRENT=" + CARD_SPAN_CURRENT +
7780
", \nCARD_SPAN_NORMAL=" + CARD_SPAN_NORMAL +
7881
", \nCARD_SPAN_NORMAL_MIN=" + CARD_SPAN_NORMAL_MIN +

0 commit comments

Comments
 (0)