Android--控件的滑动事件

感谢大佬:https://www.cnblogs.com/zkb-0928/p/3768209.html 感谢大佬:https://blog.csdn.net/sweiqin/article/details/50847996

在android开发中,我们经常会用到一种非常方便的效果,就是左右或上下滑动进行切换内容或控件,比如要删除一条信息,向左滑动会出现一个删除功能键进行删除。

要实现这个功能我们就可以使用onTouch事件来处理,具体代码如下:

package com.example.text;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView txtTest;
    
    private float moveX;
    private float moveY;
    private float pressX;
    private float pressY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        txtTest = (TextView)findViewById(R.id.txtTest);
        
        
        txtTest.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                //按下
                case MotionEvent.ACTION_DOWN:
                    pressX = event.getX();
                    pressY = event.getY();
                    break;
                //移动
                case MotionEvent.ACTION_MOVE:
                    moveX = event.getX();
                    moveY = event.getY();
                    break;
                //松开
                case MotionEvent.ACTION_UP:
                    if (moveX-pressX > 0 && Math.abs(moveY - pressY) < 50) {
                        Log.i("message", "向右");
                    } else if (moveX - pressX < 0 && Math.abs(moveY - pressY) < 50) {
                        Log.i("message", "向左");
                    }
                    break;
                default:
                    break;
                }
                return true;
            }
        });
    }

}
1、
若return false说明没有成功执行onTouch事件,在执行完onTouch里面的代码之后,onTouch事件并没有结束。因此某些组件如Gallery会自动执行它所在view里onTouch方法的代码。若在onTouch方法里面增加你的代码并且最后return false就会执行你在OnTouch方法中的处理操作了。 

2、
若return true说明你已经成功执行onTouch方法了,在执行完onTouch中的代码之后,这个onTouch事件就结束了。也不会再调用组件如Gallery默认的onTouch方法了。在onTouch方法中,我们可以做很多操作,如move,down,up等等,若我们在move里面return false,那么接着的fling,up等后面的事件也不会处理。 

Gallery.setOnTouchListener(new OnTouchListener(){  

    //@Override  
    public boolean onTouch(View v, MotionEvent event) {  
System.out.println("Gallery onTouch");  
if(event.getAction()==MotionEvent.ACTION_MOVE){  
   mDismiss.removeMessages(1);  
   System.out.println("ACTION_MOVE ");  
     
}else if(event.getAction()==MotionEvent.ACTION_UP){  
   mDismiss.sendEmptyMessageDelayed(1,10000);  
   System.out.println("ACTION_UP ");  
}  
return false;  
    }  
      
}); 
 
注意:
1.
在ViewGroup中onInterceptTouchEvent方法若反回false,那么触屏事件会继续向下传递,但如果没有子View去处理这个事件,即子view的onTouchEvent没有返回True,则最后还是由ViewGroup去处理这个事件,也就又执行了自己的onTouchEvent。
2.
onTouch调用前会自动调用onInterceptTouchEvent 如果onInterceptTouchEvent返回的false,则不会调用onTouchEvent,若重写onInterceptTouchEvent让它在需要调用onTouchEvent时返回true
原文地址:https://www.cnblogs.com/tfxz/p/12621629.html