我有RecycleView
个自定义行。点击一行是通过RecyclerView.OnItemTouchListener
处理的。
我的自定义行设置了涟漪效果:
android:clickable="true"
android:focusable="true"
android:background="@drawable/list_item_bg"
一切都按预期工作,我可以看到涟漪效应。
但是......当我点击一行时我开始一个新的Activity
,它会立即启动并且涟漪效应不再可见。
有没有办法,所以新的Activity只能在涟漪动画之后运行?
OnItemTouchListener.java
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private RecyclerClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final RecyclerClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
@绘制-V21 / list_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/green_dark">
<item>
<shape>
<corners android:radius="2dp"/>
<solid android:color="@color/green"/>
</shape>
</item>
<item android:id="@android:id/mask">
<shape>
<solid android:color="@android:color/white"/>
<corners android:radius="5dp"/>
</shape>
</item>
</ripple>
答案 0 :(得分:0)
解决问题的最简单方法是延迟行动的效果。
// onClick
yourView.postDelayed(new Runnable(){
@Override
public void run(){
yourContext.startActivity(new Intent(yourContext, YourActivity.class)
/*.putExtra(...)*/);
}
}, ANIMATION_DURATION_MILLIS);
注意:您可能需要使用一些布尔标志来防止多次点击。
答案 1 :(得分:0)
您可以使用Handler
并在转到新活动之前添加一些延迟,以便可以看到Ripple
动画
<强>代码强>
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
clickListener.onClick(child, rv.getChildPosition(child)); //perform Task
}
}, 1000); //dealy Time
}
return false;
}
更好更清洁的方法是使用View.OnClickListener
代替Touch。它将首先自动显示动画。
这是好Example