我试图在向左/向右滑动时显示自定义视图(或图像)。
我接近让它工作,但是我在使用自定义图像方面遇到了问题。
我想要的效果与此相似:RecyclerView ItemTouchHelper swipe remove animation
看看下面发生了什么。当滑动发生时,它正在扭曲图像:
以下是我的代码:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
View itemView = viewHolder.itemView;
Paint p = new Paint();
if (dX > 0) {
Drawable d = ContextCompat.getDrawable(getActivity(), R.drawable.test_check);
d.setBounds(itemView.getLeft(), itemView.getTop(), (int) dX, itemView.getBottom());
d.draw(c);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
如何在继续绘制背景颜色的同时保持图像静止?甚至可以使用Android视图而不是图像?与此类似:https://github.com/wdullaer/SwipeActionAdapter
答案 0 :(得分:5)
您可以准备回收者视图项目布局以包括复选符号ImageView
,也可以包含仅具有背景颜色的另一个空白视图。您还应将所有可滑动内容移动到嵌套布局中。为视图持有者中的可滑动内容指定引用。然后,只需在setTranslationX
中的可滑动内容上调用onChildDraw
,例如:
((MyViewHolder) viewHolder).swipeableContent.setTranslationX(dX);
Recycler视图项布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/recycler_view_item_height"
android:background="@color/transparent">
<!-- background color view -->
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/purple" />
<!-- check symbol image view -->
<ImageView
android:layout_width="match_parent"
android:layout_height="@dimen/check_symbol_width"
android:contentDescription="@null"
android:src="@drawable/check_symbol" />
<!-- swipeable content container -->
<LinearLayout
android:id="@+id/swipeable_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!-- here goes your swipeable content -->
</LinearLayout>
</RelativeLayout>
查看持有人类:
class MyViewHolder extends RecyclerView.ViewHolder {
// Swipeable content container.
LinearLayout swipeableContent;
/*
... here goes other sub-views
*/
public ExpenseViewHolder(final View itemView) {
super(itemView);
// bind swipeable content container view
swipeableContent = (LinearLayout) itemView.findViewById(R.id.swipeable_content);
/*
... bind other sub-views
*/
}
}
ItemTouchHelper.Callback子类:
class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
@Override
public void onChildDraw(final Canvas c,
final RecyclerView recyclerView,
final RecyclerView.ViewHolder viewHolder,
final float dX,
final float dY,
final int actionState,
final boolean isCurrentlyActive) {
if (viewHolder instanceof MyViewHolder) {
// translate by swipe amount,
// the check symbol and the background will stay in place
((MyViewHolder) viewHolder).swipeableContent.setTranslationX(dX);
}
}
}
答案 1 :(得分:0)
我不确定您是否有解决方案,也不确定您是否看过这个图书馆。
我为我的一个项目尝试Android-SwipeListView库,为另一个项目SwipeMenuListView尝试类似的要求。
两者都在他们的位置正常工作。您应该尝试一下,并检查它应该如何适用于您的要求。
如果您需要我更多的帮助,请告诉我。
享受编码......:)
答案 2 :(得分:0)
只需将d.setBounds()中的(int)dX
更改为您想要的任何integer
。
例如:
d.setBounds(itemView.getLeft(), itemView.getTop(), 50, itemView.getBottom());