Как реализовать двойной щелчок в андроиде
Я делаю проект, в котором я хочу отобразить конкретное сообщение в одно касание и другое сообщение в двойное касание с помощью Android. Как я могу реализовать его.
Мой пример кода ниже
if(firstTap){
thisTime = SystemClock.u`enter code here`ptimeMillis();
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(AddLocation.this, "DOUBLE TAP DETECTED!!!", Toast.LENGTH_LONG).show();
//PUT YOUR LOGIC HERE!!!!
}else{
//Otherwise Reset firstTap
firstTap = true;
}
}else{
firstTap = true;
}
}
return false;
11 ответов
Почему вы не используете событие Long Press во время его рекомендуемого интерфейса. Читать ответ Здесь я настоятельно рекомендую использовать это.
Или, если вы все-таки хотите реализовать, у вас есть два варианта, один из них - использование логического значения, а второй - использование Gesture Listener.
Попробуй использовать GestureDetector
,
public class MyView extends View {
GestureDetector gestureDetector;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// creating new gesture detector
gestureDetector = new GestureDetector(context, new GestureListener());
}
// skipping measure calculation and drawing
// delegate the event to the gesture detector
@Override
public boolean onTouchEvent(MotionEvent e) {
//Single Tap
return gestureDetector.onTouchEvent(e);
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
// event when double tap occurs
@Override
public boolean onDoubleTap(MotionEvent e) {
float x = e.getX();
float y = e.getY();
Log.d("Double Tap", "Tapped at: (" + x + "," + y + ")");
return true;
}
}
Это удерживается, но для новых читателей я сделал небольшую библиотеку, чтобы упростить подобные вещи, проверьте эту статью: Слушатель двойного щелчка на Android.
Библиотека очень маленькая, и вот ссылка на репозиторий GitHub.
И вы просто будете использовать это так:
Button btn = new Button(this);
btn.setOnClickListener( new DoubleClick(new DoubleClickListener() {
@Override
public void onSingleClick(View view) {
// Single tap here.
}
@Override
public void onDoubleClick(View view) {
// Double tap here.
}
});
you can use on long click instead of using double click by override this method
abstract boolean onLongClick(View v)
Вызывается, когда вид был нажат и удержан.
Вы можете использовать RxAndroid в этом случае в Kotlin это должно быть так:
yourView.clicks().buffer(500, TimeUnit.MILLISECONDS, 2).filter {
it.size >= 2
}.subscribe {
// Handle double click
}
- Мы применяем
clicks()
функция расширения в данном представлении, которая создает наблюдаемую последовательность RX. - Мы сообщаем, что RX должен генерировать событие после 500 мс или двух последовательных щелчков в течение 500 мс.
- Мы говорим RX принимать только события только с 2 последовательных кликов
- Наконец, что не менее важно, мы подписываемся на последовательность событий, которая является нашим обработчиком DoubleClick
Я сделал такое простое решение -
buttonTab.setOnClickListener(new View.OnClickListener() {
int count = 0;
Handler handler = new Handler();
Runnable runnable = () -> count = 0;
@Override
public void onClick(View v) {
if (!handler.hasCallbacks(runnable))
handler.postDelayed(runnable, 500);
if(count==2){
/*View is double clicked.Now code here.*/
}
}
});
Попробуйте приведенный ниже модифицированный код:
//Check that thisTime is greater than prevTime
//just incase system clock reset to zero
static prevtime = 0;
thistime = Calendar.getInstance().getTimeInMillis();
if(prevTime<thistime){
//Check if times are within our max delay
if((thisTime - prevTime) <= 1000){//1 SEC
//We have detected a double tap!
Toast.makeText(AddLocation.this, "DOUBLE TAP DETECTED!!!", Toast.LENGTH_LONG).show();
prevtime=thistime;
//PUT YOUR LOGIC HERE!!!!
}else{
//Otherwise Reset firstTap
firstTap = true;
}
}else{
firstTap = true;
}
}
Мы расширили
OnClickListener
поэтому его можно легко применить к любому представлению:
/**
* Allows to set double click events on views.
*
* @param action The action to perform on click.
* @param interval The maximum interval between two clicks, in milliseconds.
*/
class DoubleClickListener(private val action: (view: View) -> Unit, private val interval: Long = 800) : View.OnClickListener {
companion object {
/** The view that was clicked previously. */
private var myPreviouslyClickedView: WeakReference<View>? = null
/**
* Check if the click was a second one or not.
* @param view The view to check for.
*
* @return True if the click was a second one.
*/
private fun isSecondClick(view: View) =
myPreviouslyClickedView?.get() == view
}
/** Execute the click. */
override fun onClick(view: View?) {
if (view != null) {
// Make sure this click is the second one
if (isSecondClick(view)) {
myPreviouslyClickedView?.clear()
action(view)
} else {
// Set the previous view to this one but remove it after few moments
myPreviouslyClickedView = WeakReference(view)
view.postDelayed({ myPreviouslyClickedView?.clear() }, interval)
}
}
}
}
Недвижимость
myPreviouslyClickedView
гарантирует, что может быть несколько представлений с использованием прослушивателя.
Часть 2
Кроме того, мы немного упростили назначение прослушивателя, расширив
View
:
/**
* Set a double click listener on a view.
*
* @param action The action to perform on a double click.
*/
fun View.setOnDoubleClickListener(action: (view: View) -> Unit) =
this.setOnClickListener(DoubleClickListener(action))
Или, чтобы обрабатывать настраиваемые интервалы между двумя кликами:
/**
* Set a double click listener on a view.
*
* @param interval The maximum interval between two clicks, in milliseconds.
* @param action The action to perform on a double click.
*/
fun View.setTimedOnDoubleClickListener(interval: Long, action: (view: View) -> Unit) =
this.setOnClickListener(DoubleClickListener(action, interval))
вот полный пример прослушивателя двойного нажатия в котлине
class MainActivity : AppCompatActivity() {
private lateinit var gDetector : GestureDetectorCompat
private lateinit var touchListener : View.OnTouchListener
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// instantiate GestureDetectorCompat
gDetector = GestureDetectorCompat(
this,
GestureDetector.SimpleOnGestureListener()
)
// Create anonymous class extend OnTouchListener and SimpleOnGestureListener
touchListener = object : View.OnTouchListener, GestureDetector.SimpleOnGestureListener() {
override fun onTouch(view: View?, event: MotionEvent?): Boolean {
gDetector.onTouchEvent(event)
gDetector.setOnDoubleTapListener(this)
return true
}
override fun onDoubleTap(e: MotionEvent?): Boolean {
Log.i("debug", "onDoubleTap")
return true
}
}
anyView.setOnTouchListener(touchListener)
}
}
Я реализовал код, по которому цвет фона и цвет текста меняется при двойном нажатии на экран (двойное нажатие) вот код...
int i = 0;
reader.setOnClickListener(new View.OnClickListener() {
int i = 0;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i++;
Handler handler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
i = 0;
}
};
if (i == 1) {
//Single click
handler.postDelayed(r, 250);
} else if (i == 2) {
if(color==1) {
reader.setTextColor(0xFF000000);
reader.setBackgroundColor(0xFFFFFFFF);
color = 2;
}else if(color==2)
{
reader.setTextColor(0xFFFFFFFF);
reader.setBackgroundColor(0xFF000000);
color=1;
}
i = 0;
}
}
});
Подкласс View.OnClickListener
Я создал DoubleClickListener, используя интерфейс и поток. Он может быть использован с любым View так же, как классический ClickListener. Вот как вы можете добавить мой слушатель для событий двойного щелчка.
Пример,
button.setOnClickListener(new DoubleTapListener(this));
И в любой деятельности переопределите этот метод для выполнения задачи
@Override
public void onDoubleClick(View v) {
// Do what you like
}
Реализация:
Давайте посмотрим реализацию. Я создал простой DoubleTapListener, но используя этот подход, вы можете создавать сложные сенсорные слушатели (Tripletouch Listener, одинарный, двойной, тройной слушатель все в одном).
1) DoubleTapListener
public class DoubleTapListener implements View.OnClickListener{
private boolean isRunning= false;
private int resetInTime =500;
private int counter=0;
private DoubleTapCallback listener;
public DoubleTapListener(Context context)
{
listener = (DoubleTapCallback)context;
}
@Override
public void onClick(View v) {
if(isRunning)
{
if(counter==1) //<-- makes sure that the callback is triggered on double click
listener.onDoubleClick(v);
}
counter++;
if(!isRunning)
{
isRunning=true;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(resetInTime);
isRunning = false;
counter=0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
2) DoubleTapCallback
public interface DoubleTapCallback {
public void onDoubleClick(View v);
}
3) Реализуйте обратный вызов в вашей деятельности и переопределите метод
public class MainActivity extends AppCompatActivity implements DoubleTapCallback{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new DoubleTapListener(this)); //<-- Set listener
}
@Override
public void onDoubleClick(View v) {
// Toast to show double click
}
}
Соответствующая ссылка:
Вы можете увидеть полную реализацию кода ЗДЕСЬ