Re: [android-group-japan: 23092] onKeyLongPressの長押し判定時間について

3,142 views
Skip to first unread message

松村勇輝

unread,
May 29, 2013, 7:30:04 AM5/29/13
to android-g...@googlegroups.com

松村です。

判定時間は500msがデフォルトのようです。

ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT = 500

各コンポーネントからは同クラスのgetLongPressTimeout()で判定されます。

ただ、このApiを使わずに独自に判断しているものも少なからずあるようです。

また、長押下判定時間は
/data/data/com.android.providers.settings/databases/settings.db
にあるsecureテーブルのlong_press_timeout値
が定義されていればこちらが優先されるようです。

2013/05/29 19:35 "波男" <yokoroi...@gmail.com>:
日本Androidの会の皆様、こんばんわ。
波男と申します。
初めての投稿かつ基本的な質問で恐縮ですが、
お分かりになられる方がいましたら是非教えてください。

【質問内容】
キーボードのキーを長押しした際に発生するイベントとして、
onKeyLongPressがあることは皆様もご存じかと思いますが、
この長押し判定時間は具体的にいくつなのでしょうか?

本当に基本的な質問で申し訳ございませんが、どなたか
ご教示願います。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

波男

unread,
May 29, 2013, 8:01:26 AM5/29/13
to android-g...@googlegroups.com
松村勇輝 様

波男です。早速のご回答ありがとうございます。
最近Androidアプリ開発を始めたばかりですので、
/data/data/com.android.providers.settings/databases/settings.db
に定義されているパラメタに関する用途はこれから勉強していきたいと
思います。
ありがとうございました!

2013年5月29日水曜日 19時33分12秒 UTC+9 波男:

Makoto Yamazaki

unread,
May 29, 2013, 8:15:15 AM5/29/13
to android-g...@googlegroups.com
zaki です。

secure テーブルの値のチェックも含めて ViewConfiguration が面倒みてくれるので
通常はActivity 内であれば ViewConfiguration.get(this).getLongPressTimeout() で取得する
ミリ秒値を使えば OK です。

設定画面の「ユーザー補助」で「押し続ける時間」の項目の値を変えると 500 から
1500の間で値が変化しました。


2013/5/29 波男 <yokoroi...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
YAMAZAKI Makoto

波男

unread,
May 29, 2013, 8:56:24 PM5/29/13
to android-g...@googlegroups.com
zaki 様

波男です。おはようございます。
ご回答いただきありがとうございます。ご回答の内容について1つ質問させてください。

> 設定画面の「ユーザー補助」で「押し続ける時間」の項目の値を変えると 500 から
> 1500の間で値が変化しました。
仮に、「キーリピート時間」が500msに設定されていた場合、「押し続ける時間」を1500msに
設定してしまうと、キー入力した500ms後にキーが連続して表示され、1500ms後に長押し
処理が実行されるのでしょうか?それとも「キーリピート時間」と「押し続ける時間」は同一の
パラメタですか?

Makoto Yamazaki

unread,
May 29, 2013, 10:24:57 PM5/29/13
to android-g...@googlegroups.com
zaki です。

試したことがないので知らないです。
ViewConfiguration クラスに getKeyRepeatDelay() とかいうのがあるようなので
コードを書いて試してみればわかるのではないでしょうか。

結果がわかったらここで共有してもらえると嬉しいです。


2013年5月30日 9:56 波男 <yokoroi...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
YAMAZAKI Makoto

Makoto Yamazaki

unread,
May 29, 2013, 10:26:55 PM5/29/13
to android-g...@googlegroups.com
zaki です。

getKeyRepeatDelay() じゃなくて getKeyRepeatTimeout() の方でした。



2013年5月30日 11:24 Makoto Yamazaki <makot...@gmail.com>:



--
YAMAZAKI Makoto

松村勇輝

unread,
May 30, 2013, 10:40:55 AM5/30/13
to android-g...@googlegroups.com
波男様

松村です。

> 仮に、「キーリピート時間」が500msに設定されていた場合、「押し続ける時間」を1500msに
> 設定してしまうと、キー入力した500ms後にキーが連続して表示され、1500ms後に長押し
> 処理が実行されるのでしょうか?それとも「キーリピート時間」と「押し続ける時間」は同一の
> パラメタですか?
すみません。波男様の仰る"キーリピート時間"というのが何を指し
ておられるのかわからないのですが、
 "ViewConfiguration.KEY_REPEAT_DELAYを指している"
の前提で話を進めさせて頂きます。

調査結果を下記に記載いたします。

結論から言いますと、KEY_REPEAT_DELAYとDEFAULT_LONG_PRESS_TIMEOUT
は別物であり、KEY_REPEAT_DELAYの値は長押下が判定されるまでの
時間に影響しないと思われます。

KEY_REPEAT_DELAYは
"(キーが長押下された際の)InputManagerから通知されるキーディスパッチ間隔"
です。
アプリ観点では "dispatchKeyEventメソッドが呼ばれる間隔" と
思ってもらって問題ないです。

例えば、KEY_REPEAT_DELAYの値を5000にすれば、キー押下している
間はdispatchKeyEventが約5000msの間隔で呼ばれ続けます。

# この値を意識する必要があるのは、アプリ開発者というより
# HW⇔SW間等のチューニングを行うメーカー側にあると思われます。
# なので、アプリ開発では意識しなくてよさそうです。

解析にあたり、関係するソースコード箇所を残しておきます。

●dispatchKeyEventが呼ばれるまで
LINUX/android/frameworks/base/services/input/InputDispatcher.cpp
○void InputDispatcher::dispatchOnceInnerLocked(nsecs_t*)
    if (currentTime >= mKeyRepeatState.nextRepeatTime) { //★
        mPendingEvent = synthesizeKeyRepeatLocked(currentTime); 
    ...
    done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);


●nextRepeatTime設定箇所
LINUX/android/frameworks/base/services/input/InputDispatcher.cpp
○InputDispatcher::KeyEntry* InputDispatcher::synthesizeKeyRepeatLocked(nsecs_t)
    mKeyRepeatState.nextRepeatTime = currentTime + mConfig.keyRepeatDelay;


●mConfig.keyRepeatDelay設定箇所
LINUX/android/frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp
○void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
    jint keyRepeatDelay = env->CallIntMethod(mServiceObj,
            gServiceClassInfo.getKeyRepeatDelay);  //★
    if (!checkAndClearExceptionFromCallback(env, "getKeyRepeatDelay")) {
        outConfig->keyRepeatDelay = milliseconds_to_nanoseconds(keyRepeatDelay);
    }


●KeyRepeatDelay定義箇所
LINUX/android/frameworks/base/services/java/com/android/server/input/InputManagerService.java
    // Native callback.
    private int getKeyRepeatDelay() {
        return ViewConfiguration.getKeyRepeatDelay();
    }

LINUX/android/frameworks/base/core/java/android/view/ViewConfiguration.java
    /**
     * Defines the time between successive key repeats in milliseconds.
     */
    private static final int KEY_REPEAT_DELAY = 50;

    /**
     * @return the time between successive key repeats in milliseconds.
     */
    public static int getKeyRepeatDelay() {
        return KEY_REPEAT_DELAY;
    }

以上です。

2013年5月30日木曜日 9時56分24秒 UTC+9 波男:

波男

unread,
May 30, 2013, 8:42:38 PM5/30/13
to android-g...@googlegroups.com
松村勇輝 様

波男です。

調査および丁寧な解説ありがとうございます。
私が認識している”キーリピート時間”について説明します。間違っていたらご指摘ください。。。

例えば、”a”というキーが長押下された場合、キーリピートが有効であれば、”aaa...”のように、
同一文字が連続して出力されると思います。その際、1文字目が出力されてから2文字目が
出力されるまでの時間を指しています。

従って、松村様がご説明いただいた”KEY_REPEAT_DELAY”というのは、上記の例で言いますと、
2文字目以降に出力される文字間隔の時間に相当するかと思われるんですが…間違ってましたら
本当にごめんなさい。

松村勇輝

unread,
Jun 3, 2013, 8:01:32 AM6/3/13
to android-g...@googlegroups.com
To: 波男様
(投稿者宛に返信してしまったので再送します)

松村です。

1文字目が出力されてから2文字目が出力されるまでの時間
こちらで確認した限りですと、KEY_REPEAT_DELAYはこの時間に影響しないようです。
---
[確認環境]
 - qwertyキー非搭載、Back/Home/Menuは静電キーとして搭載

・Backキー長押下
 - dispatchKeyEventは押下直後に2度通知され、その後は5000ms間隔で通知される

・USB経由でキーボード接続し、[F]キーを長押下
 - dispatchKeyEventは押下直後から通知され続ける(KEY_REPEAT_DELAYの値に影響しない)
  =>KEY_REPEAT_DELAYを5000に変更しても同一文字が連続して出力される間隔は変わらない
---

なぜBackと[F]キーの間に差異があるのか明らかな理由はわかりませんでした。
お力になれず申し訳ございません。

以上です。

2013年5月31日金曜日 9時42分38秒 UTC+9 波男:

波男

unread,
Jun 3, 2013, 8:16:13 PM6/3/13
to android-g...@googlegroups.com
松村勇輝 様

波男です。

調査報告ありがとうございます。
たしかにBackSpaceキーとFキーになぜ差異が生じているかは分かりませんね。
キーリピートまでの時間に関しては私の方でもう少し調べてみます。
お忙しいところご協力いただき、本当にありがとうございました。

以上
Reply all
Reply to author
Forward
0 new messages