为了账号安全,请及时绑定邮箱和手机立即绑定

如何同时使用Ontouch和Onclick的ImageButton?

/ 猿问

如何同时使用Ontouch和Onclick的ImageButton?

qq_遁去的一_1 2019-12-26 09:31:31

在我的应用中,我希望发生两件事。

  1. 当我触摸并拖动ImageButton时,它应该与我的手指一起移动。

    OnTouchListener()为此使用,它工作正常。

  2. 当我单击ImageButton时,它应该关闭活动。

    OnClickListener()为此使用,它也可以正常工作。

所以,这是我的问题。每当我移动ImageButton OnTouchListener按钮ImageButton时,OnClickListener都会触发该按钮,并且当我释放按钮移动时,也会在结束时触发。

如何在同一个按钮上使用ontouch和onclick侦听器而不互相干扰?


查看完整描述

3 回答

?
开满天机

试试这个,可能对您有帮助


无需设置onClick()方法onTouch()将处理两种情况。


package com.example.demo;


import android.app.Activity;

import android.os.Bundle;

import android.view.GestureDetector;

import android.view.GestureDetector.SimpleOnGestureListener;

import android.view.Menu;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageButton;


public class MainActivity extends Activity {

    private GestureDetector gestureDetector;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        gestureDetector = new GestureDetector(this, new SingleTapConfirm());

        ImageButton imageButton = (ImageButton) findViewById(R.id.img);


        imageButton.setOnTouchListener(new OnTouchListener() {


            @Override

            public boolean onTouch(View arg0, MotionEvent arg1) {


                if (gestureDetector.onTouchEvent(arg1)) {

                    // single tap

                    return true;

                } else {

                    // your code for move and drag

                }


                return false;

            }

        });


    }


    private class SingleTapConfirm extends SimpleOnGestureListener {


        @Override

        public boolean onSingleTapUp(MotionEvent event) {

            return true;

        }

    }


}


查看完整回答
反对 回复 2019-12-26
?
泛舟湖上清波郎朗

有Click Listener,DoubleClick Listener,OnLongPress Listener,Swipe Left,Swipe Right,Swipe Up,Swipe Down在单View需要setOnTouchListener。即


view.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {


            @Override

            public void onClick() {

                super.onClick();

                // your on click here

            }


            @Override

            public void onDoubleClick() {

                super.onDoubleClick();

                // your on onDoubleClick here

            }


            @Override

            public void onLongClick() {

                super.onLongClick();

                // your on onLongClick here

            }


            @Override

            public void onSwipeUp() {

                super.onSwipeUp();

                // your swipe up here

            }


            @Override

            public void onSwipeDown() {

                super.onSwipeDown();

                // your swipe down here.

            }


            @Override

            public void onSwipeLeft() {

                super.onSwipeLeft();

                // your swipe left here.

            }


            @Override

            public void onSwipeRight() {

                super.onSwipeRight();

                // your swipe right here.

            }

        });


}

为此,您需要OnSwipeTouchListener实现的类OnTouchListener。


public class OnSwipeTouchListener implements View.OnTouchListener {


private GestureDetector gestureDetector;


public OnSwipeTouchListener(Context c) {

    gestureDetector = new GestureDetector(c, new GestureListener());

}


public boolean onTouch(final View view, final MotionEvent motionEvent) {

    return gestureDetector.onTouchEvent(motionEvent);

}


private final class GestureListener extends GestureDetector.SimpleOnGestureListener {


    private static final int SWIPE_THRESHOLD = 100;

    private static final int SWIPE_VELOCITY_THRESHOLD = 100;


    @Override

    public boolean onDown(MotionEvent e) {

        return true;

    }


    @Override

    public boolean onSingleTapUp(MotionEvent e) {

        onClick();

        return super.onSingleTapUp(e);

    }


    @Override

    public boolean onDoubleTap(MotionEvent e) {

        onDoubleClick();

        return super.onDoubleTap(e);

    }


    @Override

    public void onLongPress(MotionEvent e) {

        onLongClick();

        super.onLongPress(e);

    }


    // Determines the fling velocity and then fires the appropriate swipe event accordingly

    @Override

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        boolean result = false;

        try {

            float diffY = e2.getY() - e1.getY();

            float diffX = e2.getX() - e1.getX();

            if (Math.abs(diffX) > Math.abs(diffY)) {

                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {

                    if (diffX > 0) {

                        onSwipeRight();

                    } else {

                        onSwipeLeft();

                    }

                }

            } else {

                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {

                    if (diffY > 0) {

                        onSwipeDown();

                    } else {

                        onSwipeUp();

                    }

                }

            }

        } catch (Exception exception) {

            exception.printStackTrace();

        }

        return result;

    }

}


public void onSwipeRight() {

}


public void onSwipeLeft() {

}


public void onSwipeUp() {

}


public void onSwipeDown() {

}


public void onClick() {


}


public void onDoubleClick() {


}


public void onLongClick() {


}

}


查看完整回答
反对 回复 2019-12-26
?
至尊宝的传说

onClick和OnTouch事件的问题在于,当您单击Click(意图单击)时,它会假设该事件为OnTouch,因此从不解释OnClick。周围的工作


isMove = false;

case MotionEvent.ACTION_DOWN:

//Your stuff

isMove = false;

case MotionEvent.ACTION_UP:

if (!isMove || (Xdiff < 10 && Ydiff < 10 ) {

view.performClick; //The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little

even when you just click it   

}

case MotionEvent.ACTION_MOVE:

isMove = true;


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信