Реализация слушателя OnTap

У меня есть сомнения, что прослушиватель нажатий реализован на конкретной кнопке или изображении или представлении? потому что сайты, которые я просматривал, отображаются только для всего макета, и я хочу, чтобы мое действие выполнялось при нажатии на представление. пожалуйста помоги. Спасибо.


person Riddhi Dudani    schedule 16.07.2011    source источник


Ответы (4)


Любое представление можно настроить с помощью onClickListener(), который является частью класса представления. Самый простой способ сделать это — настроить ссылки на представление в методе onCreate(). Вот пример просмотра изображения:

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
        ....
    }
});

ОБНОВЛЕНИЕ: ДВОЙНОЕ НАЖАТИЕ

Вот пример активности, которая реализует базовое обнаружение двойного касания в представлении изображения:

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;
            }
        });
    }
}
person Kenny    schedule 16.07.2011
comment
да, я знаю этот код, Кенни, но я спрашиваю, можно ли реализовать DOUBLE TAP LISTENER для определенного вида или для всего экрана. я делаю проект, в котором я должен действовать при нажатии только на вид, а не на весь экран. - person Riddhi Dudani; 16.07.2011
comment
Вы нигде не упомянули двойной тап в своем вопросе! Но я расширил свой ответ, чтобы показать вам один из возможных способов сделать это. - person Kenny; 17.07.2011

В основном, чтобы воспринять событие касания, вы должны реализовать GestureDetector.OnGestureListener в своей деятельности. Вы можете выполнить действие, используя onSingleTapUp(MotionEvent e) метод GestureDetector.OnGestureListener.

Обычно для элемента управления Button мы используем как

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

или другие clickListners и события касания используются для ImageView или любых других пользовательских представлений.

person Balaji Khadake    schedule 16.07.2011

Добавьте android:onClick="tapEvent" в свой макет, на который вы хотите нажать. Изменяя значение MAX_TAP_COUNT, вы можете использовать любое количество нажатий.

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;

}
person Akshay Kumar S    schedule 20.03.2017

person    schedule
comment
Вы должны добавить объяснение к своему ответу, потому что это поможет автору легко понять. - person Son Truong; 25.12.2018