android开发 滑动屏幕的监听

使用如下三个文件就好,包含上下左右,对角线滑动

MainActivity

public class MainActivity extends Activity {
    GestureDetector detector;
    private TextView activity_main_tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity_main_tv = (TextView) findViewById(R.id.activity_main_tv);

        detector = new GestureDetector(this, new MyGestureListener(
                new MyRightLeftListener() {
                    @Override
                    public void onRight() {
                        activity_main_tv.setBackgroundColor(
                                Color.GREEN);
                    }

                    @Override
                    public void onLeft() {
                        activity_main_tv.setBackgroundColor(
                                Color.RED);
                    }

                    @Override
                    public void onUp() {
                        // TODO Auto-generated method stub
                        activity_main_tv.setBackgroundColor(
                                Color.BLUE);
                    }
                    @Override
                    public void onDown() {
                        // TODO Auto-generated method stub
                        activity_main_tv.setBackgroundColor(
                                Color.YELLOW);
                    }

                    @Override
                    public void onSlide() {
                        activity_main_tv.setText("斜画的结果");
                    }
                }));
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return detector.onTouchEvent(event);
    }
}


MyGestureListener

public class MyGestureListener implements OnGestureListener {
    private MyRightLeftListener listener;
    // 垂直方向移动的距离,绝对值
    private float distanceY;
    // 水平方向移动的距离,绝对值
    private float distanceX;
    // 移动距离大于下面的值时,才触发滑动屏幕的监听
    private float distance = 100;

    public MyGestureListener(MyRightLeftListener listener) {
        // TODO Auto-generated constructor stub
        this.listener = listener;
    }

    /**
     * 一旦触摸屏按下,就马上产生onDown事件
     */
    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    /**
     * 点击了触摸屏,但是没有移动和弹起的动作onShowPressonDown的区别在于 onDown是,
     * 一旦触摸屏按下,就马上产生onDown事件,但是onShowPressonDown事件产生后,
     * 一段时间内,如果没有移动鼠标和弹起事件,就认为是onShowPress事件。
     */
    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub
    }

    /**
     * 轻击触摸屏后,弹起。如果这个过程中产onLongPressonScrollonFling事件, 就不会 产生onSingleTapUp事件。
     */
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    /**
     * 当手在屏幕上滑动过程中触发,参数跟onFling一样(注意两者的区别)
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    /**
     * 长按屏幕时触发
     */
    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub
    }

    /**
     * 当手在屏幕上滑动但手离开屏幕时触发
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                           float velocityY) {
        // TODO Auto-generated method stub
        // 按下时的x坐标
        float startX = e1.getX();
        // 按下时的y坐标
        float startY = e1.getY();
        // 抬起时的x坐标
        float endtX = e2.getX();
        // 抬起时的y坐标
        float endtY = e2.getY();

        // 水平方向移动的距离,绝对值
        distanceX = Math.abs(endtX - startX);
        // 垂直方向移动的距离,绝对值
        distanceY = Math.abs(endtY - startY);
        // 首先判断是水平方向移动还是垂直方向移动

        if (distanceX>300&&distanceY>500) {

            listener.onSlide();
        }

        if (distanceX > distanceY) {
            // 说明水平反向移动的距离远,就认定为水平移动
            if (distanceX > distance) {
                // 水平方向移动距离大局默认距离是才触发滑动监听事件
                if (startX > endtX) {
                    // 手指从右往左滑动
                    listener.onLeft();
                } else {
                    // 手指从左往右滑动
                    listener.onRight();
                }
            }
        } else if (distanceX < distanceY) {
            // 说明垂直反向移动的距离远,就认定为垂直移动
            if (distanceY > distance) {
                // 垂直方向移动距离大局默认距离是才触发滑动监听事件
                if (startY > endtY) {
                    // 手指从下往上滑动
                    listener.onUp();
                } else {
                    // 手指从上往下滑动
                    listener.onDown();
                }
            }
        } else {
            // 水平方向和垂直方向移动距离相同时,默认为水平方向的移动
            if (distanceX > distance) {
                // 水平方向移动距离大局默认距离是才触发滑动监听事件
                if (startX > endtX) {
                    // 手指从右往左滑动
                    listener.onLeft();
                } else {
                    // 手指从左往右滑动
                    listener.onRight();
                }
            }
        }
        return false;
    }
}

MyRightLeftListener

public interface MyRightLeftListener {
    /**
     * 手指从左往右滑动
     */
    void onRight();

    /**
     * 手指从右往左滑动
     */
    void onLeft();

    /**
     * 手指从下往上滑动
     */
    void onUp();

    /**
     * 手指从上往下滑动
     */
    void onDown();

    /**
     * 斜画屏幕
     * */
    void onSlide();
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值