OnTap listener implementation

僤鯓⒐⒋嵵緔 提交于 2019-12-18 09:03:40

问题


I have a doubt that is on tap listener implemented on a particular button, or image view or view? because the sites which I surfed only shows for the whole layout and I want my action to be performed on the tapping of a view. please help. Thank you.


回答1:


Any view can be setup with an onClickListener() which is part of the view class. The easiest way to do it is when you setup the references to your view in the onCreate() method. Here is an example for a image view:

ImageView iv = (ImageView) findViewByID(R.id.example);
iv.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
        // Do what you need to do on click
        ....
    }
});

UPDATE: DOUBLE TAP

Here is a sample activity which implements basic double tap detection on an image view:

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class DoubleTapActivity extends Activity {
    //Set the double tap delay in milliseconds
    protected static final long DOUBLE_CLICK_MAX_DELAY = 1000L;
    private ImageView iView;
    private long thisTime = 0;
    private long prevTime = 0;
    private boolean firstTap = true;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        iView = (ImageView)findViewById(R.id.iView);
        iView.setOnTouchListener( new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if(firstTap){
                    thisTime = SystemClock.uptimeMillis();
                    firstTap = false;
                }
                else
                {
                    prevTime = thisTime;
                    thisTime = SystemClock.uptimeMillis();

                    //Check that thisTime is greater than prevTime
                    //just incase system clock reset to zero
                    if(thisTime > prevTime){

                        //Check if times are within our max delay
                        if((thisTime - prevTime) <= DOUBLE_CLICK_MAX_DELAY){

                            //We have detected a double tap!
                            Toast.makeText(DoubleTapActivity.this, "DOUBLE TAP DETECTED!!!", Toast.LENGTH_LONG).show();
                            //PUT YOUR LOGIC HERE!!!!

                        }
                        else 
                        {
                            //Otherwise Reset firstTap
                            firstTap = true;
                        }
                    }
                    else 
                    {
                        firstTap = true;
                    }
                }
                return false;
            }
        });
    }
}



回答2:


Mostly to sense tap event you have to implement GestureDetector.OnGestureListener in your Activity. You can perform action by using onSingleTapUp(MotionEvent e) method of GestureDetector.OnGestureListener.

Generally for Button control, we use like

myButton.setOnClickListener(new OnClickListener() {});

or other clickListners and tap events are used for ImageView or any other customviews.




回答3:


Add android:onClick="tapEvent" in your layout which you want to take the click. By changing the MAX_TAP_COUNT value, you can use any number of taps.

private long thisTime = 0;
private long prevTime = 0;
private int tapCount = 0;
private static  final int MAX_TAP_COUNT = 5;
protected static final long DOUBLE_CLICK_MAX_DELAY = 500;


public void tapEvent(View v){

    if (SystemClock.uptimeMillis() > thisTime) {
        if ((SystemClock.uptimeMillis() - thisTime) > DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) {
            Log.d(TAG, "touch event " + "resetting tapCount = 0");
            tapCount = 0;
        }
        if (tapCount()) {
           //DO YOUR LOGIC HERE
        }
    }
}

private Boolean tapCount(){

    if (tapCount == 0) {
        thisTime = SystemClock.uptimeMillis();
        tapCount++;
    } else if (tapCount < (MAX_TAP_COUNT-1)) {
        tapCount++;
    } else {
        prevTime = thisTime;
        thisTime = SystemClock.uptimeMillis();

        //just incase system clock reset to zero
        if (thisTime > prevTime) {

            //Check if times are within our max delay
            if ((thisTime - prevTime) <= DOUBLE_CLICK_MAX_DELAY * MAX_TAP_COUNT) {
                //We have detected a multiple continuous tap!
                //Once receive multiple tap, reset tap count to zero for consider next tap as new start
                tapCount = 0;
                return true;
            } else {
                //Otherwise Reset tapCount
                tapCount = 0;
            }
        } else {
            tapCount = 0;
        }
    }
    return false;

}



回答4:


@Override
public boolean onTouchEvent(MotionEvent event) {

    // on action down do your work...
    return super.onTouchEvent(event);
}


来源:https://stackoverflow.com/questions/6716224/ontap-listener-implementation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!