From 73936b1a8b30c1fa65eadc4c4e1ecde88c75b8f9 Mon Sep 17 00:00:00 2001 From: wangbc Date: Sun, 19 Jan 2020 15:37:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A6=E6=BB=91=E5=8F=B3?= =?UTF-8?q?=E6=BB=91=E3=80=81=E5=9B=9E=E9=80=80=E7=AD=89=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yuqirong/cardswipeview/MainActivity.java | 32 +++- .../img_buttons_hate_normal.png | Bin 0 -> 3437 bytes .../img_buttons_hate_pressed.png | Bin 0 -> 3708 bytes .../img_buttons_like_normal.png | Bin 0 -> 3597 bytes .../img_buttons_like_pressed.png | Bin 0 -> 5958 bytes .../main/res/drawable/ic_reply_black_24dp.xml | 9 ++ .../drawable/img_buttons_hate_selector.xml | 5 + .../drawable/img_buttons_like_selector.xml | 5 + app/src/main/res/layout/activity_main.xml | 46 +++++- .../CardItemTouchHelperCallback.java | 150 +++++++++++++++++- .../cardswipelayout/CardRecyclerView.java | 34 ++++ 11 files changed, 271 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/img_buttons_hate_normal.png create mode 100644 app/src/main/res/drawable-xhdpi/img_buttons_hate_pressed.png create mode 100644 app/src/main/res/drawable-xhdpi/img_buttons_like_normal.png create mode 100644 app/src/main/res/drawable-xhdpi/img_buttons_like_pressed.png create mode 100644 app/src/main/res/drawable/ic_reply_black_24dp.xml create mode 100644 app/src/main/res/drawable/img_buttons_hate_selector.xml create mode 100644 app/src/main/res/drawable/img_buttons_like_selector.xml create mode 100644 lib/src/main/java/me/yuqirong/cardswipelayout/CardRecyclerView.java diff --git a/app/src/main/java/com/yuqirong/cardswipeview/MainActivity.java b/app/src/main/java/com/yuqirong/cardswipeview/MainActivity.java index d37d99e..dfd833f 100644 --- a/app/src/main/java/com/yuqirong/cardswipeview/MainActivity.java +++ b/app/src/main/java/com/yuqirong/cardswipeview/MainActivity.java @@ -8,6 +8,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.Toast; @@ -17,12 +18,15 @@ import me.yuqirong.cardswipelayout.CardConfig; import me.yuqirong.cardswipelayout.CardItemTouchHelperCallback; import me.yuqirong.cardswipelayout.CardLayoutManager; +import me.yuqirong.cardswipelayout.CardRecyclerView; import me.yuqirong.cardswipelayout.OnSwipeListener; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements View.OnClickListener { private List list = new ArrayList<>(); + private CardItemTouchHelperCallback cardCallback; + private CardRecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { @@ -33,10 +37,17 @@ protected void onCreate(Bundle savedInstanceState) { } private void initView() { - final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); + ImageButton likeButton = (ImageButton) findViewById(R.id.like_button); + ImageButton hateButton = (ImageButton) findViewById(R.id.hate_button); + ImageButton backButton = (ImageButton) findViewById(R.id.back_button); + likeButton.setOnClickListener(this); + hateButton.setOnClickListener(this); + backButton.setOnClickListener(this); + + recyclerView = (CardRecyclerView) findViewById(R.id.recyclerView); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(new MyAdapter()); - CardItemTouchHelperCallback cardCallback = new CardItemTouchHelperCallback(recyclerView.getAdapter(), list); + cardCallback = new CardItemTouchHelperCallback(recyclerView, recyclerView.getAdapter(), list); cardCallback.setOnSwipedListener(new OnSwipeListener() { @Override @@ -91,6 +102,21 @@ private void initData() { list.add(R.drawable.img_avatar_07); } + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.like_button: + cardCallback.handleCardSwipe(CardConfig.SWIPING_RIGHT, 300L); + break; + case R.id.hate_button: + cardCallback.handleCardSwipe(CardConfig.SWIPING_LEFT, 300L); + break; + case R.id.back_button: + cardCallback.handlerCardBack(300L); + break; + } + } + private class MyAdapter extends RecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { diff --git a/app/src/main/res/drawable-xhdpi/img_buttons_hate_normal.png b/app/src/main/res/drawable-xhdpi/img_buttons_hate_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4fcd2406ff236fc65b9ecf1566e0305eb74a4f GIT binary patch literal 3437 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/img_buttons_hate_pressed.png b/app/src/main/res/drawable-xhdpi/img_buttons_hate_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5110c569efe6331eb37d59d77ed6c8dcac785110 GIT binary patch literal 3708 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/img_buttons_like_pressed.png b/app/src/main/res/drawable-xhdpi/img_buttons_like_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..eff6e4f96e7bb414c9f2f1951eae8bbfa989acce GIT binary patch literal 5958 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 + + diff --git a/app/src/main/res/drawable/img_buttons_hate_selector.xml b/app/src/main/res/drawable/img_buttons_hate_selector.xml new file mode 100644 index 0000000..355cbb4 --- /dev/null +++ b/app/src/main/res/drawable/img_buttons_hate_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/img_buttons_like_selector.xml b/app/src/main/res/drawable/img_buttons_like_selector.xml new file mode 100644 index 0000000..3867936 --- /dev/null +++ b/app/src/main/res/drawable/img_buttons_like_selector.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a9ea790..d97d1bf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,9 +6,51 @@ android:orientation="vertical" tools:context="com.yuqirong.cardswipeview.MainActivity"> - + android:layout_height="0dp" + android:layout_weight="1" /> + + + + + + + + + + + + + diff --git a/lib/src/main/java/me/yuqirong/cardswipelayout/CardItemTouchHelperCallback.java b/lib/src/main/java/me/yuqirong/cardswipelayout/CardItemTouchHelperCallback.java index 0742755..597d4b8 100644 --- a/lib/src/main/java/me/yuqirong/cardswipelayout/CardItemTouchHelperCallback.java +++ b/lib/src/main/java/me/yuqirong/cardswipelayout/CardItemTouchHelperCallback.java @@ -1,11 +1,17 @@ package me.yuqirong.cardswipelayout; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; import android.graphics.Canvas; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; +import android.view.animation.Interpolator; +import android.widget.Toast; +import java.util.ArrayList; import java.util.List; /** @@ -17,13 +23,42 @@ public class CardItemTouchHelperCallback extends ItemTouchHelper.Callback { private final RecyclerView.Adapter adapter; private List dataList; private OnSwipeListener mListener; + private CardRecyclerView recyclerView; + ValueAnimator swipeAnimator; + //需要撤回的View列表 + List mLastReturnList = new ArrayList<>(); + //需要添加道卡片的列表 + List needAddLastList = new ArrayList<>(); - public CardItemTouchHelperCallback(@NonNull RecyclerView.Adapter adapter, @NonNull List dataList) { - this.adapter = checkIsNull(adapter); - this.dataList = checkIsNull(dataList); + public int getReturnSize(){ + return mLastReturnList.size(); + } + + public void addData(T data) { + needAddLastList.add(data); + } + + public static class ReturnView { + + RecyclerView.ViewHolder viewHolder; + Integer direction; + T curData; + + public ReturnView(RecyclerView.ViewHolder viewHolder, Integer direction, T data) { + this.viewHolder = viewHolder; + this.direction = direction; + this.curData = data; + } + + } + + public CardItemTouchHelperCallback(@NonNull CardRecyclerView recyclerView, @NonNull RecyclerView.Adapter adapter, @NonNull List dataList) { + this(recyclerView, adapter, dataList, null); } - public CardItemTouchHelperCallback(@NonNull RecyclerView.Adapter adapter, @NonNull List dataList, OnSwipeListener listener) { + public CardItemTouchHelperCallback(@NonNull CardRecyclerView recyclerView, @NonNull RecyclerView.Adapter adapter, + @NonNull List dataList, OnSwipeListener listener) { + this.recyclerView = checkIsNull(recyclerView); this.adapter = checkIsNull(adapter); this.dataList = checkIsNull(dataList); this.mListener = listener; @@ -63,12 +98,20 @@ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int layoutPosition = viewHolder.getLayoutPosition(); T remove = dataList.remove(layoutPosition); adapter.notifyDataSetChanged(); + + mLastReturnList.add(new ReturnView(viewHolder,direction,remove)); if (mListener != null) { mListener.onSwiped(viewHolder, remove, direction == ItemTouchHelper.LEFT ? CardConfig.SWIPED_LEFT : CardConfig.SWIPED_RIGHT); } + // 当没有数据时回调 mListener if (adapter.getItemCount() == 0) { - if (mListener != null) { + if(needAddLastList.size() > 0) { + dataList.addAll(needAddLastList); + needAddLastList.clear(); + mLastReturnList.clear(); + adapter.notifyDataSetChanged(); + }else if (mListener != null) { mListener.onSwipedClear(); } } @@ -133,4 +176,101 @@ private float getThreshold(RecyclerView recyclerView, RecyclerView.ViewHolder vi return recyclerView.getWidth() * getSwipeThreshold(viewHolder); } + public T handlerCardBack(long duration) { + if(mLastReturnList.isEmpty()) { + Toast.makeText(recyclerView.getContext(),"当前不可返回",Toast.LENGTH_SHORT).show(); + return null; + } + + final ReturnView returnView = mLastReturnList.remove(mLastReturnList.size()-1); + + // 移除 onTouchListener,否则触摸滑动会乱了 + RecyclerView.ViewHolder topHolder = recyclerView.findViewHolderForAdapterPosition(0); + if(topHolder != null&&topHolder.itemView != null) { + topHolder.itemView.setOnTouchListener(null); + } + + dataList.add(0, (T) returnView.curData); + adapter.notifyDataSetChanged(); + + if (swipeAnimator != null && swipeAnimator.isStarted()) { + return null; + } + final CardRecyclerView recyclerView = checkIsNull(this.recyclerView); + final Canvas canvas = checkIsNull(this.recyclerView.getCanvas()); + if (returnView.viewHolder == null) { + return null; + } + if (returnView.direction == CardConfig.SWIPING_LEFT) { + swipeAnimator = ValueAnimator.ofFloat(-recyclerView.getWidth() / 2, 0); + } else if (returnView.direction == CardConfig.SWIPING_RIGHT) { + swipeAnimator = ValueAnimator.ofFloat(recyclerView.getWidth() / 2, 0); + } else { + throw new IllegalStateException("flag must be one of SWIPING_LEFT or SWIPING_RIGHT"); + } + swipeAnimator.setDuration(duration); + swipeAnimator.setInterpolator(null); + swipeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + + float value = (float) animation.getAnimatedValue(); + onChildDraw(canvas, recyclerView, returnView.viewHolder, value, 0, ItemTouchHelper.ACTION_STATE_SWIPE, false); + } + }); + swipeAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); +// onSwiped(returnView.viewHolder, returnView.direction == CardConfig.SWIPING_LEFT ? ItemTouchHelper.LEFT : ItemTouchHelper.RIGHT); + } + }); + swipeAnimator.start(); + + return (T) returnView.curData; + + } + + public void handleCardSwipe(int flag, long duration) { + handleCardSwipe(flag, duration, null); + } + + public void handleCardSwipe(final int flag, long duration, Interpolator interpolator) { + if (swipeAnimator != null && swipeAnimator.isStarted()) { + return; + } + final CardRecyclerView recyclerView = checkIsNull(this.recyclerView); + final Canvas canvas = checkIsNull(this.recyclerView.getCanvas()); + final RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(0); + if (viewHolder == null) { + return; + } + if (flag == CardConfig.SWIPING_LEFT) { + swipeAnimator = ValueAnimator.ofFloat(0, -recyclerView.getWidth() / 2); + } else if (flag == CardConfig.SWIPING_RIGHT) { + swipeAnimator = ValueAnimator.ofFloat(0, recyclerView.getWidth() / 2); + } else { + throw new IllegalStateException("flag must be one of SWIPING_LEFT or SWIPING_RIGHT"); + } + swipeAnimator.setDuration(duration); + swipeAnimator.setInterpolator(interpolator); + swipeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + + float value = (float) animation.getAnimatedValue(); + onChildDraw(canvas, recyclerView, viewHolder, value, 0, ItemTouchHelper.ACTION_STATE_SWIPE, true); + } + }); + swipeAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + onSwiped(viewHolder, flag == CardConfig.SWIPING_LEFT ? ItemTouchHelper.LEFT : ItemTouchHelper.RIGHT); + clearView(recyclerView, viewHolder); + } + }); + swipeAnimator.start(); + } + } diff --git a/lib/src/main/java/me/yuqirong/cardswipelayout/CardRecyclerView.java b/lib/src/main/java/me/yuqirong/cardswipelayout/CardRecyclerView.java new file mode 100644 index 0000000..01d5f98 --- /dev/null +++ b/lib/src/main/java/me/yuqirong/cardswipelayout/CardRecyclerView.java @@ -0,0 +1,34 @@ +package me.yuqirong.cardswipelayout; + +import android.content.Context; +import android.graphics.Canvas; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; + +public class CardRecyclerView extends RecyclerView { + + private Canvas canvas; + + public CardRecyclerView(Context context) { + super(context); + } + + public CardRecyclerView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public CardRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void onDraw(Canvas c) { + this.canvas = c; + super.onDraw(c); + } + + public Canvas getCanvas() { + return canvas; + } +}