キーの長押し判定について

2,210 views
Skip to first unread message

レイ

unread,
Nov 17, 2009, 3:57:48 AM11/17/09
to 日本Androidの会
TO)Android有識者の皆様
こんばんは レイです。

現在ActivityのonKeyDownにて
キーの短押しと長押しで処理を分けたいと思っているのですが
なかなかうまくいきません。

現在行っている長押し判定は

if(event.getRepeatCount() >0){
処理1
else{
処理2
}

という風に書いているのですが、
これだと、まず処理2がコールされ、そのご処理1が続けて処理されてしまいます。

この前は、長押しをonKeyDownで処理し、短押しをonKeyUpで処理させようとしたのですが
onKeyDownで処理した後、続けてonKeyUpの処理が走ってしまい
これも思ったように動いてくれません。

なにか良い方法をご存知の方は、ご教授願います。



adamrocker

unread,
Nov 17, 2009, 4:56:20 AM11/17/09
to android-g...@googlegroups.com
レイさん

adamrockerです。
onLongPressを使うとかどうでしょう?

http://developer.android.com/intl/ja/reference/android/app/Activity.html#onKeyLongPress(int,%20android.view.KeyEvent)

2009年11月17日17:57 レイ <beginner...@gmail.com>:

レイ

unread,
Nov 17, 2009, 5:53:03 AM11/17/09
to 日本Androidの会
adamrockerさん
こんばんは レイです。

早速の回答ありがとうございます。

onKeyLongPressですが
これはどうやって使うのでしょう?

KeyEvent.Callbackをimplementsしても、使えないようです。

申し訳ありませんが、使用法をご存知でしたらご教授をお願いいたします。



On 11月17日, 午後6:56, adamrocker <adamroc...@gmail.com> wrote:
> レイさん
>
> adamrockerです。
> onLongPressを使うとかどうでしょう?
>
> http://developer.android.com/intl/ja/reference/android/app/Activity.h...)
>
> 2009年11月17日17:57 レイ <beginner.engi...@gmail.com>:
>
>
>
>
>
> > TO)Android有識者の皆様
> > こんばんは レイです。
>
> > 現在ActivityのonKeyDownにて
> > キーの短押しと長押しで処理を分けたいと思っているのですが
> > なかなかうまくいきません。
>
> > 現在行っている長押し判定は
>
> > if(event.getRepeatCount() >0){
> > 処理1
> > else{
> > 処理2
> > }
>
> > という風に書いているのですが、
> > これだと、まず処理2がコールされ、そのご処理1が続けて処理されてしまいます。
>
> > この前は、長押しをonKeyDownで処理し、短押しをonKeyUpで処理させようとしたのですが
> > onKeyDownで処理した後、続けてonKeyUpの処理が走ってしまい
> > これも思ったように動いてくれません。
>
> > なにか良い方法をご存知の方は、ご教授願います。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

adamrocker

unread,
Nov 17, 2009, 6:50:57 AM11/17/09
to android-g...@googlegroups.com
レイさん

adamrockerです。
私も使った事無いのですが、
onKeyDownみたくオーバーライドして使えませんか?

2009年11月17日19:53 レイ <beginner...@gmail.com>:

レイ

unread,
Nov 17, 2009, 7:37:02 AM11/17/09
to 日本Androidの会
adamrockerさん
こんばんは レイです。

onKeyLongPressですがAPI Levelが5だったので
SDK 2.0から追加されたAPIのようです。

今作っているアプリケーションは1.6向けですのでAPI Levelが4までのAPIで対応する必要があります。

せっかくご教授いただいたのに使えなくて残念です。


On 11月17日, 午後8:50, adamrocker <adamroc...@gmail.com> wrote:
> レイさん
>
> adamrockerです。
> 私も使った事無いのですが、
> onKeyDownみたくオーバーライドして使えませんか?
>
> 2009年11月17日19:53 レイ <beginner.engi...@gmail.com>:
> >> - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

adamrocker

unread,
Nov 17, 2009, 8:56:14 AM11/17/09
to android-g...@googlegroups.com
レイさん

adamrockerです。
確認せず反射的に答えてしまってスミマセン。
代替案として以下はどうでしょう?

/*-----------------------*/
private int LONG_PRESS_DELAY = 500;// msec
private Handler mHandler = new Handler();
private Runnable mLongPressAction = new Runnable() {
public void run() {
//ここにLongPressの処理を書く
}
};

onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_X) {
synchronized (this) {
if (!registLongPress) {
registLongPress = true;
mHandler.postDelayed(mLongPressAction, LONG_PRESS_DELAY);
}
}
}
}

onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_X) {
synchronized (this) {
mHandler.removeCallbacks(mLongPressAction);
registLongPress = true;
}
}
}
/*-----------------------*/

xキーをdownしたらHandlerにLongPressの処理を登録して
xキーをupしたらHandlerからLongPressの処理を除外します。
除外される前にLONG_PRESS_DELAY経過していれば
mLongPressAction.run()が実行されます。
多分これでLongPressっぽい処理が書けると思います。
お試し下さい。

2009年11月17日21:37 レイ <beginner...@gmail.com>:

adamrocker

unread,
Nov 17, 2009, 8:58:30 AM11/17/09
to android-g...@googlegroups.com
adamrockerです。

onKeyUp()の処理を間違えました。
-registLongPress = true;
+registLongPress = false;

LongPressの処理は1つしか登録しませんという処理です。

2009年11月17日22:56 adamrocker <adamr...@gmail.com>:

Koike Kazuhiko

unread,
Nov 17, 2009, 3:24:57 PM11/17/09
to android-g...@googlegroups.com
GestureDetectorを使ってみてはいかがでしょうか。私が以前やってみたときは
以下のページを参考にしました。

http://www.hoge256.net/2009/09/462.html
--
小池和彦(Koike Kazuhiko)

Mogimo

unread,
Nov 19, 2009, 6:10:25 AM11/19/09
to 日本Androidの会
こんばんわ

短押し、長押しを使い分ける場合、
onKeyDown & repeat == 0
のときに処理を書くわけにはいきませんので、

onKeyDown() {
// 特定keycodeに対して
if (event.getRepeatCount() == 0) {
mLongPressed = false;
} else {
mLongPressed = true;
}
}
onKeyUp() {
// 特定keycodeに対して
if (mLongPressed) {
// 長押し処理
} else {
// 短押し処理
}
}

とされてはどうでしょう?もしくは、

mLongPressed = false;
onKeyDown() {
// 特定keycodeに対して
if (event.getRepeatCount() > 0) {
// 長押し処理
mLongPressed = true;
}
}
onKeyUp() {
// 特定keycodeに対して
if (!mLongPressed) {
// 短押し処理
mLongPressed = false;
}
}

長押下でリピート処理をされるつもりではないということを前提にして書いてます。

レイ

unread,
Nov 21, 2009, 1:19:06 AM11/21/09
to 日本Androidの会
Koike Kazuhikoさん
こんにちは、レイです。

ご教授頂いたやり方を試したのですが
GestureDetectorはタッチの時のみ使用できるようで
キーの押下では使用できないようです。
残念

しかし画面タッチの際の処理も入れる予定ですので
参考になりました。

情報ありがとうございます。
> 小池和彦(Koike Kazuhiko)- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

レイ

unread,
Nov 21, 2009, 1:28:40 AM11/21/09
to 日本Androidの会
Mogimoさん
こんにちは レイです。

ご教授頂いたやり方にて実装を行ないました。
現状特に問題なく、希望通りの動作を行なっております。

フラグ管理は、避けたかったですがイベントがない為
これを本実装として搭載いたします。

ありがとうございました。

Koike Kazuhiko

unread,
Nov 21, 2009, 4:35:05 AM11/21/09
to android-g...@googlegroups.com
すいません、質問の趣旨を誤解していました。

SDK 1.6までだとキーの長押し判定は簡単にできないんですね。驚きました。
--
小池和彦(Koike Kazuhiko)
Reply all
Reply to author
Forward
0 new messages