Android仿qq侧滑——上
16lz
2021-01-26
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); } }}
更多相关文章
- android 绕过R文件,通过代码获取styleable的属性
- Android(安卓)手机拍照
- android6.0 Phone源码分析之Phone适配过程
- [置顶] AndroidStudio与eclipse打包的时候报错。Error:(4) Error
- Android简单封装类似JQuery异步请求
- Android:逆向工程之资源ID还原小工具
- Android: 记一个关于获取输入法弹起高度的新方式
- Android(安卓)使用ThumbnailUtils类获取视频的缩略图
- android 实现GridView多选效果