K, САМЫЙ МИНИМИЗИРОВАННЫЙ Kotlin идиоматический путь:
class OnSingleClickListener(private val block: () -> Unit) : View.OnClickListener {
private var lastClickTime = 0L
override fun onClick(view: View) {
if (SystemClock.elapsedRealtime() - lastClickTime < 1000) {
return
}
lastClickTime = SystemClock.elapsedRealtime()
block()
}
}
fun View.setOnSingleClickListener(block: () -> Unit) {
setOnClickListener(OnSingleClickListener(block))
}
Использование:
button.setOnSingleClickListener { ... }
Прежде всего, не забудьте добавить hfm на экран;)
На самом деле нажатие кнопки работает нормально.
Теперь, чтобы щелчок по растровому изображению также работал, реализуйте защищенное логическое событие touchEvent (сообщение TouchEvent) для своего BitmapField. Лучше создать расширенный класс:
class MyCanvas extends MainScreen implements FieldChangeListener {
HorizontalFieldManager hfm;
private Bitmap startBitmap;
private BitmapField startBitmapField;
private ButtonField okButton;
private ButtonField cancelButton;
MyCanvas() {
hfm = new HorizontalFieldManager();
add(hfm);
startBitmap = Bitmap.getBitmapResource("start.png");
startBitmapField = new TouchBitmapField(startBitmap);
startBitmapField.setChangeListener(this);
hfm.add(startBitmapField);
okButton = new ButtonField("Ok", ButtonField.CONSUME_CLICK
| ButtonField.NEVER_DIRTY);
okButton.setChangeListener(this);
hfm.add(okButton);
cancelButton = new ButtonField("Cancel", ButtonField.CONSUME_CLICK
| ButtonField.NEVER_DIRTY);
cancelButton.setChangeListener(this);
hfm.add(cancelButton);
}
public void fieldChanged(Field field, int context) {
if (field == startBitmapField) {
System.out.println("Touched START...");
} else if (field == okButton) {
System.out.println("Touched Ok...");
} else if (field == cancelButton) {
System.out.println("Touched Cancel...");
}
}
}
class TouchBitmapField extends BitmapField {
public TouchBitmapField(Bitmap startBitmap) {
super(startBitmap);
}
protected boolean touchEvent(TouchEvent message) {
if (TouchEvent.CLICK == message.getEvent()) {
FieldChangeListener listener = getChangeListener();
if (null != listener)
listener.fieldChanged(this, 1);
}
return super.touchEvent(message);
}
}