16年那会写项目用到了仿qq测滑删除,那时候只是一顾的搬代码,这段时间在学习自定义View,把之前的代码梳理了一下,写了一个仿qq测滑的效果
代码如下,注释写的很清楚了。接下来会升级一下在ItemView下放三个子View
package com.monitor.atmosphere.slide;
import android.content.Context;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
/**
* Created by donghe on 2019/7/12.
*/
public class MyItemSlideHelper implements RecyclerView.OnItemTouchListener{
private float lastX,lastY;
private View mTargetView;
private Callback callback;
public MyItemSlideHelper(Context context,Callback callback){
this.callback = callback;
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
Log.d("donghe",e.getX()+"");
Log.d("donghe","onInterceptTouchEvent");
lastX = e.getX();
lastY = e.getY();
switch (e.getAction()){
case MotionEvent.ACTION_DOWN :
mTargetView = callback.findTargetView(lastX,lastY);
break;
}
return true;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
//通过view的onTouchEvent拦截MotionEvent传给手势监听
float x = e.getX();
switch (e.getAction()){
case MotionEvent.ACTION_MOVE:
float disX = lastX - x;
if(mTargetView == null){
return;
}
horizontalScroll(disX);
break;
}
}
/**
*
* @param disX 每次需要滑动的距离
*/
private void horizontalScroll(float disX){
//view以坐标系左上角对应自身的刻度
int scrollX = mTargetView.getScrollX();
int scrollY = mTargetView.getScrollY();
//每次需要滑动的距离是基于原来view的位置进行滑动
scrollX += disX;
//获取向左滑动的最大范围
int horRange = getHorizontalRanges(callback.getChildViewHolder(mTargetView));
/**
* scrollX > 0 表示向左滑动,相反向右滑动
*/
if(scrollX > 0){
if(horRange > scrollX){
//scrollTo方法 scrollX > 0 表示向左移动
mTargetView.scrollTo(scrollX,scrollY);
}else{
mTargetView.scrollTo(horRange,scrollY);
}
}else{
mTargetView.scrollTo(0, scrollY);
}
}
private int getHorizontalRanges(RecyclerView.ViewHolder holder) {
if(holder.itemView instanceof LinearLayout){
ViewGroup viewGroup = (ViewGroup) holder.itemView;
if(viewGroup.getChildCount() == 2){
return viewGroup.getChildAt(1).getLayoutParams().width;
}
}
return 0;
}
public interface Callback {
//得到当前viewholder
RecyclerView.ViewHolder getChildViewHolder(View childView);
//根据按下的位置获取当前view
View findTargetView(float x, float y);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
package com.monitor.atmosphere.slide;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.monitor.atmosphere.customviewone.R;
/**
* Created by donghe on 2019/7/9.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements MyItemSlideHelper.Callback{
RecyclerView recyclerView;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,parent,false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(position+"");
}
@Override
public int getItemCount() {
return 3;
}
@Override
public RecyclerView.ViewHolder getChildViewHolder(View childView) {
return recyclerView.getChildViewHolder(childView);
}
@Override
public View findTargetView(float x, float y) {
return recyclerView.findChildViewUnder(x,y);
}
//adapter中的方法
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
recyclerView.addOnItemTouchListener(new MyItemSlideHelper(recyclerView.getContext(),this));
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.count_tv);
}
}
}