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 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);        }    }}

 

更多相关文章

  1. android 绕过R文件,通过代码获取styleable的属性
  2. Android(安卓)手机拍照
  3. android6.0 Phone源码分析之Phone适配过程
  4. [置顶] AndroidStudio与eclipse打包的时候报错。Error:(4) Error
  5. Android简单封装类似JQuery异步请求
  6. Android:逆向工程之资源ID还原小工具
  7. Android: 记一个关于获取输入法弹起高度的新方式
  8. Android(安卓)使用ThumbnailUtils类获取视频的缩略图
  9. android 实现GridView多选效果

随机推荐

  1. Mediaplayer中通过create函数获取资源时P
  2. android sharedpreference保存boolean,int
  3. Android开发小技巧 | 一句命令搞定截屏
  4. Android Launcher研究(一)-----------图
  5. android开发游记:android studio工程 转换
  6. android点滴(8) -- android应用程序的生
  7. Android中如何使控件保持固定宽高比
  8. [置顶] Android开发之动态库调用
  9. 在iOS / Android的统一字体问题
  10. android背景选择器selector用法、自定义B