android(触摸监听,以及gesturedetector处理手势)

一、使用监听器的方式来判断触摸

//控件对象
    private ImageView img;
    private TextView txt;

    //手势分析对象
    private GestureDetector gestureDetector=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);

        img=(ImageView)findViewById(R.id.img);
        txt=(TextView)findViewById(R.id.txt);

        //创建手势分析对象--同时设定手势识别监听器,用于监听识别结果,参数--Context,OnGestureListener()
        gestureDetector=new GestureDetector(this, new  GestureScaleListener());

        //View必须设置longClickable为true,否则手势识别无法正确工作
        img.setLongClickable(true);

        //为ImageView添加触摸监听处理
        img.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction())
                {
                    case MotionEvent.ACTION_DOWN:
                        Display("ACTION_DOWN",event);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Display("ACTION_MOVE",event);
                        break;
                    case MotionEvent.ACTION_UP:
                        Display("ACTION_UP",event);
                        break;
                }
                return true; //此处必须返回true,才能接收处理移动/抬起事件.
                //return gestureDetector.onTouchEvent(event); //此处不作任何触摸处理,转去手势识别对象进行手势分析
            }
        });
//显示触摸信息
    private void Display(String eventType, MotionEvent event){
        int x = (int)event.getX();
        int y = (int)event.getY();
        float pressure = event.getPressure();
        float size = event.getSize();
        int RawX = (int)event.getRawX();
        int RawY = (int)event.getRawY();

        String msg = "";
        msg += "事件类型:" + eventType + "\n";
        msg += "相对坐标:"+String.valueOf(x)+","+String.valueOf(y)+"\n";
        msg += "绝对坐标:"+String.valueOf(RawX)+","+String.valueOf(RawY)+"\n";
        msg += "触点压力:"+String.valueOf(pressure)+"\n";
        msg += "触点尺寸:"+String.valueOf(size)+"\n";

        txt.setText(msg);
    }

二、使用gesturedetector

//控件对象
    private ImageView img;
    private TextView txt;

    //手势分析对象
    private GestureDetector gestureDetector=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);

        img=(ImageView)findViewById(R.id.img);
        txt=(TextView)findViewById(R.id.txt);

        //创建手势分析对象--同时设定手势识别监听器,用于监听识别结果,参数--Context,OnGestureListener()
        gestureDetector=new GestureDetector(this, new  GestureScaleListener());

        //View必须设置longClickable为true,否则手势识别无法正确工作
        img.setLongClickable(true);

        //为ImageView添加触摸监听处理
        img.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event); //此处不作任何触摸处理,转去手势识别对象进行手势分析
            }
        });
    }

    //显示触摸信息
    private void Display(String eventType, MotionEvent event){
        int x = (int)event.getX();
        int y = (int)event.getY();
        float pressure = event.getPressure();
        float size = event.getSize();
        int RawX = (int)event.getRawX();
        int RawY = (int)event.getRawY();

        String msg = "";
        msg += "事件类型:" + eventType + "\n";
        msg += "相对坐标:"+String.valueOf(x)+","+String.valueOf(y)+"\n";
        msg += "绝对坐标:"+String.valueOf(RawX)+","+String.valueOf(RawY)+"\n";
        msg += "触点压力:"+String.valueOf(pressure)+"\n";
        msg += "触点尺寸:"+String.valueOf(size)+"\n";

        txt.setText(msg);
    }

    //手势识别的监听器类--监听手势识别对象的识别结果
    class GestureScaleListener implements GestureDetector.OnGestureListener {

        // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发Java代码
        @Override
        public boolean onDown(MotionEvent arg0) {
            System.out.println("onDown");
            return false;
        }

        //用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            System.out.println("onFling");

            String s="";
            if (e1.getY() - e2.getY() > 30
                    && Math.abs(velocityY) > 50) { //速度和距离都超过一定数值时才算滑动
                // Fling up
                s="上滑";
            } else	if (e2.getY() - e1.getY() >30
                    && Math.abs(velocityY) > 50) {
                // Fling down
                s="下滑";
            }
            else
                s="未定";
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();

            return false;
        }

        // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
        @Override
        public void onLongPress(MotionEvent e) {
            System.out.println("onLongPress");
        }

        // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
            System.out.println("onScroll");
            return false;
        }

        // 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
        // 注意和onDown()的区别,强调的是没有松开或者拖动的状态
        @Override
        public void onShowPress(MotionEvent e) {
            System.out.println("onShowPress");
        }

        //用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            System.out.println("onSingleTapUp");
            return false;
        }

    }

点一下

发布了34 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38420342/article/details/84566673