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

更多相关文章

  1. Android左右滑动切换图片
  2. Android(安卓)滑动关闭Activity实现
  3. 通过AspectJX拦截Android重复点击事件
  4. Android布局(一)之基本视图View
  5. Android(安卓)自学之拖动条SeekBar
  6. Android(安卓)UI 之WaterFall瀑布流效果 [复制链接]
  7. [置顶] 一个类搞定Android适配!!
  8. android 实现抽屉效果
  9. android屏幕横向滚动,android图片横向滚动

随机推荐

  1. Android布局居中的几种做法
  2. Kotlin编程之AndroidStudio(包括3.0与2.x
  3. Eclipse中安装Android并配置IDE(集成开发
  4. Android中的接口回调
  5. Android 中文API (65) —— BluetoothClass
  6. Android:Activity(七):Fragment与Activit
  7. Android(安卓)- Binder驱动
  8. [译]Android 泄露范例: 视图订阅
  9. 运行android的SDK Manager.exe无反应
  10. google android 项目