ScrollView和EditText 滑动冲突的解决办法
16lz
2021-01-26
import android.content.Context;import android.support.v7.widget.AppCompatEditText;import android.text.Layout;import android.util.AttributeSet;import android.view.MotionEvent;public class ScrollEditText extends AppCompatEditText { private final int MOVE_SLOP = 20; //移动距离临界 //滑动距离的最大边界 private int mOffsetHeight; //是否到顶或者到底的标志 private boolean mBottomFlag = false; private boolean isCanScroll = false;//标记内容是否触发了滚动 private float lastY = 0; public ScrollEditText(Context context) { this(context,null); } public ScrollEditText(Context context, AttributeSet attrs) { super(context,attrs); } public ScrollEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int paddingTop; int paddingBottom; int mHeight; int mLayoutHeight; //获得内容面板 Layout mLayout = getLayout(); mLayoutHeight = mLayout.getHeight(); paddingTop = getTotalPaddingTop(); paddingBottom = getTotalPaddingBottom(); //获得控件的实际高度 mHeight = getHeight(); //计算滑动距离的边界(H_content - H_view = H_scroll) mOffsetHeight = mLayoutHeight + paddingTop + paddingBottom - mHeight; } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN){ //手指按下事件,重置状态 mBottomFlag = false; isCanScroll = false; lastY=0; } return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { boolean result = super.onTouchEvent(event); //如果是需要拦截,则再拦截,这个方法会在onScrollChanged方法之后再调用一次 if (!mBottomFlag) getParent().requestDisallowInterceptTouchEvent(true); if (event.getAction() == MotionEvent.ACTION_MOVE){ if (lastY == 0){ lastY = event.getRawY(); } //条件:手指move了一段距离,但是onScrollChanged函数未调用,说明文字无法滚动了,则将触摸处理权交还给ParentView if (Math.abs(lastY - event.getRawY()) > MOVE_SLOP){ if (!isCanScroll){ getParent().requestDisallowInterceptTouchEvent(false); } } //Log.d("Javine","ActionMove: "+ lastY + "," + event.getRawY()); } return result; } @Override protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) { super.onScrollChanged(horiz, vert, oldHoriz, oldVert); isCanScroll = true; //Log.d("Javine","onScrolled "+vert); if (vert == mOffsetHeight || vert == 0) { //这里将处理权交还给父控件 getParent().requestDisallowInterceptTouchEvent(false); mBottomFlag = true; } }
如有问题一起探讨1129795010@qq.com
更多相关文章
- Android左右滑动切换图片
- Android(安卓)滑动关闭Activity实现
- 通过AspectJX拦截Android重复点击事件
- Android布局(一)之基本视图View
- Android(安卓)自学之拖动条SeekBar
- Android(安卓)UI 之WaterFall瀑布流效果 [复制链接]
- [置顶] 一个类搞定Android适配!!
- android 实现抽屉效果
- android屏幕横向滚动,android图片横向滚动