Skip to content

Commit 9532df1

Browse files
committed
Initial commit
1 parent de068b6 commit 9532df1

13 files changed

+207
-91
lines changed

app/src/main/java/com/wuyr/pathlayoutmanagertest/MainActivity.java

+25-5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class MainActivity extends AppCompatActivity implements CompoundButton.On
2828
private CanvasView mTrackView, mCanvasView;
2929
private PathAdapter mAdapter;
3030
private Toast mToast;
31+
private boolean isShowPath;
3132

3233
@SuppressLint("ShowToast")
3334
@Override
@@ -59,9 +60,9 @@ this, findViewById(R.id.drawer), findViewById(R.id.toolbar),
5960
findViewById(R.id.card).setEnabled(false);
6061
findViewById(R.id.normal).setEnabled(false);
6162

62-
((Switch)findViewById( R.id.orientation)).setOnCheckedChangeListener(this);
63-
((Switch)findViewById( R.id.direction_fixed)).setOnCheckedChangeListener(this);
64-
((Switch)findViewById( R.id.auto_select)).setOnCheckedChangeListener(this);
63+
((Switch) findViewById(R.id.orientation)).setOnCheckedChangeListener(this);
64+
((Switch) findViewById(R.id.direction_fixed)).setOnCheckedChangeListener(this);
65+
((Switch) findViewById(R.id.auto_select)).setOnCheckedChangeListener(this);
6566

6667
((SeekBar) findViewById(R.id.item_offset)).setOnSeekBarChangeListener(this);
6768
((SeekBar) findViewById(R.id.auto_select_fraction)).setOnSeekBarChangeListener(this);
@@ -80,7 +81,10 @@ public void handleOnClick(View view) {
8081
if (path != null && !path.isEmpty()) {
8182
mCanvasView.setVisibility(View.INVISIBLE);
8283
mTrackView.setPath(mCanvasView.getPath());
83-
// mTrackView.setVisibility(View.VISIBLE);
84+
if (isShowPath) {
85+
mTrackView.setVisibility(View.VISIBLE);
86+
}
87+
8488
mPathLayoutManager.updatePath(mCanvasView.getPath());
8589
}
8690
break;
@@ -101,17 +105,19 @@ public void handleOnClick(View view) {
101105
view.setEnabled(false);
102106
findViewById(R.id.j20).setEnabled(true);
103107
findViewById(R.id.dragon).setEnabled(true);
104-
108+
mAdapter.setType(PathAdapter.TYPE_CARD);
105109
break;
106110
case R.id.j20:
107111
view.setEnabled(false);
108112
findViewById(R.id.card).setEnabled(true);
109113
findViewById(R.id.dragon).setEnabled(true);
114+
mAdapter.setType(PathAdapter.TYPE_J20);
110115
break;
111116
case R.id.dragon:
112117
view.setEnabled(false);
113118
findViewById(R.id.card).setEnabled(true);
114119
findViewById(R.id.j20).setEnabled(true);
120+
mAdapter.setType(PathAdapter.TYPE_DRAGON);
115121
break;
116122

117123
case R.id.normal:
@@ -168,13 +174,27 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
168174
case R.id.auto_select:
169175
mPathLayoutManager.setAutoSelect(isChecked);
170176
break;
177+
case R.id.disable_fling:
178+
mPathLayoutManager.setFlingEnable(!isChecked);
179+
break;
180+
case R.id.show_path:
181+
isShowPath = isChecked;
182+
if (isChecked) {
183+
if (mCanvasView.getVisibility() == View.INVISIBLE) {
184+
mTrackView.setVisibility(View.VISIBLE);
185+
}
186+
} else {
187+
mTrackView.setVisibility(View.INVISIBLE);
188+
}
189+
break;
171190
default:
172191
break;
173192
}
174193
}
175194

176195
@Override
177196
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
197+
mToast.cancel();
178198
switch (seekBar.getId()) {
179199
case R.id.item_offset:
180200
mPathLayoutManager.setItemOffset(progress);

app/src/main/java/com/wuyr/pathlayoutmanagertest/PathAdapter.java

+102-22
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,135 @@
11
package com.wuyr.pathlayoutmanagertest;
22

33
import android.content.Context;
4+
import android.graphics.Bitmap;
5+
import android.graphics.BitmapFactory;
6+
import android.support.annotation.NonNull;
47
import android.support.v7.widget.RecyclerView;
58
import android.view.View;
69
import android.widget.ImageView;
7-
import android.widget.TextView;
810
import android.widget.Toast;
911

12+
import java.lang.ref.SoftReference;
13+
import java.util.ArrayList;
1014
import java.util.List;
15+
import java.util.Locale;
16+
import java.util.Random;
1117

1218
/**
1319
* Created by wuyr on 18-5-20 上午4:09.
1420
*/
1521
public class PathAdapter extends BaseAdapter<String, PathAdapter.ViewHolder> {
1622

17-
private Toast toast;
23+
public static final int TYPE_CARD = 0, TYPE_J20 = 1, TYPE_DRAGON = 2;
24+
private Toast mToast;
25+
private int mCurrentType;
26+
private Random mRandom = new Random();
27+
private List<SoftReference<Bitmap>> mBitmapList;
1828

1929
public PathAdapter(Context context, List<String> data) {
2030
super(context, data, R.layout.adapter_item_view, ViewHolder.class);
21-
toast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
31+
mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
32+
}
33+
34+
private void initBitmaps() {
35+
mBitmapList = new ArrayList<>();
36+
mBitmapList.add(getBitmapById(R.drawable.ic_1));
37+
mBitmapList.add(getBitmapById(R.drawable.ic_2));
38+
mBitmapList.add(getBitmapById(R.drawable.ic_3));
39+
mBitmapList.add(getBitmapById(R.drawable.ic_j20));
40+
mBitmapList.add(getBitmapById(R.drawable.ic_dragon_head));
41+
mBitmapList.add(getBitmapById(R.drawable.ic_dragon_body_1));
42+
mBitmapList.add(getBitmapById(R.drawable.ic_dragon_body_2));
43+
mBitmapList.add(getBitmapById(R.drawable.ic_dragon_tail));
44+
}
45+
46+
@NonNull
47+
private SoftReference<Bitmap> getBitmapById(int id) {
48+
return new SoftReference<>(BitmapFactory.decodeResource(mContext.getResources(), id));
49+
}
50+
51+
@Override
52+
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
53+
super.onDetachedFromRecyclerView(recyclerView);
54+
recyclerBitmaps();
55+
}
56+
57+
private void recyclerBitmaps() {
58+
for (SoftReference<Bitmap> softReference : mBitmapList) {
59+
Bitmap bitmap = softReference.get();
60+
if (bitmap != null) {
61+
bitmap.recycle();
62+
}
63+
softReference.clear();
64+
}
65+
mBitmapList.clear();
66+
mBitmapList = null;
2267
}
2368

2469
@Override
25-
public void onBindViewHolder(ViewHolder holder, int position) {
26-
//
27-
// if (position == 0) {
28-
// holder.imageView.setImageResource(R.drawable.ic_dragon_tail);
29-
// } else if (position == mData.size() - 1) {
30-
// holder.imageView.setImageResource(R.drawable.ic_dragon_head);
31-
// } else {
32-
// holder.imageView.setImageResource(new Random().nextBoolean() ? R.drawable.ic_dragon_body_1 : R.drawable.ic_dragon_body_2);
33-
// }
34-
holder.imageView.setImageResource(R.drawable.ic_j20);
35-
holder.rootView.setOnClickListener(v -> {
36-
toast.setText("点击了: " + holder.textView.getText().toString());
37-
toast.show();
70+
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
71+
switch (mCurrentType) {
72+
case TYPE_CARD:
73+
initCardHolder(holder);
74+
break;
75+
case TYPE_J20:
76+
initJ20Holder(holder);
77+
break;
78+
case TYPE_DRAGON:
79+
initDragonHolder(holder, position);
80+
break;
81+
default:
82+
break;
83+
}
84+
holder.itemView.setOnClickListener(v -> {
85+
mToast.setText(String.format(Locale.getDefault(), "item %s clicked", holder.getAdapterPosition()));
86+
mToast.show();
3887
});
39-
holder.textView.setText(position + "");
40-
holder.textView.setBackgroundColor(mContext.getResources().getColor(position % 5 == 0 ? R.color.colorPrimary : R.color.colorAccent));
88+
}
89+
90+
private void initCardHolder(ViewHolder holder) {
91+
holder.imageView.getLayoutParams().width = 360;
92+
holder.itemView.requestLayout();
93+
holder.imageView.setImageBitmap(getBitmap(mRandom.nextInt(3)));
94+
}
95+
96+
private void initJ20Holder(ViewHolder holder) {
97+
holder.imageView.getLayoutParams().width = 270;
98+
holder.itemView.requestLayout();
99+
holder.imageView.setImageBitmap(getBitmap(3));
100+
}
101+
102+
private void initDragonHolder(ViewHolder holder, int position) {
103+
holder.imageView.getLayoutParams().width = 135;
104+
holder.itemView.requestLayout();
105+
if (position == 0) {
106+
holder.imageView.setImageBitmap(getBitmap(7));
107+
} else if (position == mData.size() - 1) {
108+
holder.imageView.setImageBitmap(getBitmap(4));
109+
} else {
110+
holder.imageView.setImageBitmap(getBitmap(mRandom.nextBoolean() ? 5 : 6));
111+
}
112+
}
113+
114+
private Bitmap getBitmap(int index) {
115+
if (mBitmapList == null) {
116+
initBitmaps();
117+
}
118+
Bitmap bitmap = mBitmapList.get(index).get();
119+
return bitmap;
120+
}
121+
122+
public void setType(int type) {
123+
mCurrentType = type;
124+
notifyDataSetChanged();
41125
}
42126

43127
static class ViewHolder extends RecyclerView.ViewHolder {
44128

45-
View rootView;
46-
TextView textView;
47129
ImageView imageView;
48130

49131
public ViewHolder(View itemView) {
50132
super(itemView);
51-
textView = itemView.findViewById(R.id.text_view);
52-
rootView = itemView.findViewById(R.id.root_view);
53133
imageView = itemView.findViewById(R.id.image);
54134
}
55135
}

app/src/main/java/com/wuyr/pathlayoutmanagertest/PathLayoutManager.java

+25-5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class PathLayoutManager extends RecyclerView.LayoutManager implements Rec
4949
private long mFixingAnimationDuration;
5050
private boolean isAnimatorInitialized;
5151
private int mCacheCount;
52+
private boolean isFlingEnable;
53+
private boolean isFlinging;
5254

5355
//RecyclerView default ItemAnimator has bug on PathLayoutManager
5456
private RepairedItemAnimator mItemAnimator;
@@ -66,6 +68,7 @@ public PathLayoutManager(Path path, int itemOffset, @RecyclerView.Orientation in
6668
mFixingAnimationDuration = 250;
6769
mOrientation = orientation;
6870
mItemOffset = itemOffset;
71+
isFlingEnable = true;
6972
updatePath(path);
7073
mItemAnimator = new RepairedItemAnimator();
7174
mItemAnimator.setOnErrorListener(holder -> {
@@ -402,6 +405,9 @@ public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerVi
402405
}
403406

404407
private void updateOffsetY(float offsetY) {
408+
if (isFlinging && !isFlingEnable) {
409+
return;
410+
}
405411
mOffsetY += offsetY;
406412
int pathLength = mKeyframes.getPathLength();
407413
int itemLength = getItemLength();
@@ -437,6 +443,9 @@ private void updateOffsetY(float offsetY) {
437443
}
438444

439445
private void updateOffsetX(float offsetX) {
446+
if (isFlinging && !isFlingEnable) {
447+
return;
448+
}
440449
mOffsetX += offsetX;
441450
int pathLength = mKeyframes.getPathLength();
442451
int itemLength = getItemLength();
@@ -572,11 +581,18 @@ public void setCacheCount(int count) {
572581

573582
@Override
574583
public void onScrollStateChanged(int state) {
575-
if (state == RecyclerView.SCROLL_STATE_DRAGGING) {
576-
stopFixingAnimation();
577-
}
578-
if (isAutoSelect && state == RecyclerView.SCROLL_STATE_IDLE) {
579-
smoothScrollToPosition(findClosestPosition());
584+
isFlinging = state == RecyclerView.SCROLL_STATE_SETTLING;
585+
switch (state) {
586+
case RecyclerView.SCROLL_STATE_DRAGGING:
587+
stopFixingAnimation();
588+
break;
589+
case RecyclerView.SCROLL_STATE_IDLE:
590+
if (isAutoSelect) {
591+
smoothScrollToPosition(findClosestPosition());
592+
}
593+
break;
594+
default:
595+
break;
580596
}
581597
}
582598

@@ -771,6 +787,10 @@ public void setFixingAnimationDuration(long duration) {
771787
mFixingAnimationDuration = duration;
772788
}
773789

790+
public void setFlingEnable(boolean enable) {
791+
isFlingEnable = enable;
792+
}
793+
774794
private void checkKeyframes() {
775795
if (mKeyframes == null) {
776796
throw new NullPointerException("Path not set!");

app/src/main/java/com/wuyr/pathlayoutmanagertest/Test.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@ public class Test {
1515

1616
public static void main(String[] args) throws Exception {
1717
//(y-y2)/(y1-y2) = (x-x2)/(x1-x2)
18-
19-
float[] scales = new float[]{1F, 0F, .5F, .5F, 1F, 1F};
20-
for (float i = 0F; i < 1F; i += .01F) {
21-
// getScale(i, scales);
22-
System.out.print(i + "---->" + getScale(i, scales) + ",\n\n");
23-
// getScale2(i, scales);
24-
// System.out.print(new DecimalFormat("0.00").format(i));
25-
}
18+
// float[] scales = new float[]{1F, 0F, .5F, .5F, 1F, 1F};
19+
// for (float i = 0F; i < 1F; i += .01F) {
20+
//// getScale(i, scales);
21+
// System.out.print(i + "---->" + getScale(i, scales) + ",\n\n");
22+
//// getScale2(i, scales);
23+
//// System.out.print(new DecimalFormat("0.00").format(i));
24+
// }
2625
}
2726

2827

app/src/main/res/drawable/ic_1.png

336 KB
Loading

app/src/main/res/drawable/ic_2.png

203 KB
Loading

app/src/main/res/drawable/ic_3.png

258 KB
Loading

app/src/main/res/layout/act_main_view.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<LinearLayout
99
android:layout_width="match_parent"
1010
android:layout_height="match_parent"
11-
android:background="#eee"
11+
android:background="#fff"
1212
android:orientation="vertical">
1313

1414
<android.support.v7.widget.Toolbar

app/src/main/res/layout/adapter_card_item_view.xml

-6
This file was deleted.

app/src/main/res/layout/adapter_dragon_item_view.xml

-6
This file was deleted.

0 commit comments

Comments
 (0)