HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1111
窓月らら[HSP3Dish] Androidの戻るキーを判定する方法(tips)8解決


窓月らら

リンク

2015/11/11(Wed) 17:17:59|NO.72944

HSP3Dish で開発していて、戻るキーを検出したいと思ったことはありませんか?
onexit が使えればいいのですが、Android版では無視されます。
つまり、戻るキーでアプリを終了されると強制終了同然の状態です。

そこで、ちょっと改造します。
まず HspActivity.java または HspActivityAdMob.java に以下を追加

import android.view.KeyEvent;
更に、いちばん下のほうに以下を追加(末尾の } の1つ手前)

// 戻るキーを判定 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: // バックキー nativepoke( 0, -0x100 ); // stat に終了コードを送る return true; } } return super.dispatchKeyEvent(event); }
これで、戻るキーを押すと await 直後の stat に -0x100 が返るようになります。
HSPのコードは以下のようにします。

// 戻るキーのテスト // by 窓月らら #include "hsp3dish.as" setcls 1,$000000 // redraw 0 でクリアする, 黒 *main redraw 0 color 0,255,255 pos 8,8: mes "バックキーのテストです。" redraw 1 c++ await 17-(c\3=0) if stat=-0x100 { gosub *exit } // 判定 goto *main *exit dialog "アプリを終了しますか?",2 if stat!6 { return } // Yes以外なら戻る end // アプリ終了
end の前にデータ保存などの終了処理を書きます。
これで戻るキーで終了されても困らないアプリが作れますね♪

HSP3Dish をはじめてからずっと問題だと思っていたのですが、公式に対応されないので…。
キー検出方法は分かっていたものの、どうHSP側から取得するかがよく分からず
別の不具合を直す過程で nativepoke が使えることに気づいて利用してみました。
暫定的ですが、こんな方法があったよというサンプル。


なお、HSP 3.5β2 ではダイアログにバグがあります(下記参照)。

[HSP3Dish] dialog命令の動作(たぶん不具合)について
http://hsp.tv/play/pforum.php?mode=all&num=72850



この記事に返信する


ゼーット!!

リンク

2015/11/15(Sun) 00:47:32|NO.73027

おおぅ、それは良い情報ありがとうございます。
nativepokeで返せるんですねー。以前からhsp側に知らせる方法がないものかと思っていました。
ありがたく使わせていただきます!



kanamaru

リンク

2015/11/15(Sun) 09:44:54|NO.73029

この方法って、ランタイムの再コンパイルの必要ありますか?



窓月らら

リンク

2015/11/15(Sun) 13:03:37|NO.73031

> ゼーット!!さん

試してませんが、キーボード操作もこれでいけるような気がしてます。

> kanamaruさん

現在作業しているプロジェクトフォルダ内の HspActivity.java を書き換えて
いつもどおり HSP3Dish helper でビルドするだけです。他は何も触りません。
HSP 3.5β2 で作成したプロジェクトで動作確認しています。



kanamaru

リンク

2015/11/16(Mon) 08:21:45|NO.73041

HspActivity.javaを書き換えるのに挑戦しようと思ったのですが、
HspActivity.java側でstatの値を取得する方法がわかりません。
あと、フリック入力時のフリックの方向の取得方法がわかりません。
検索しようにもNativeactivityでもActivityでもそれっぽいのは見つかりません。
わかりますか?



窓月らら

リンク

2015/11/16(Mon) 12:17:59|NO.73043

> kanamaruさん

それはどちらもHSP側でやれば済む話では…
Java側はstatに値を送るほう、HSP側が受け取るほう。
(Java内で完結する内容ならstatに入れる意味はない)

フリックにしても、HSP側で判定できますけど。
必要な情報は、

・タッチした最初の座標1点と時間(時間の管理方法は任意)
・移動中の座標
・放した座標(もっとも新しい移動中の座標)
・タッチしてから放すまでの時間(タイマー(ms)やフレーム数など)

あとはこのxyの移動量や放すまでの時間を見ればいいだけかと。
移動量は、画面全体サイズに対しての割合にしておくとたぶん色々楽。
例えば私のVPADでは
タッチしている座標が中心軸に対してどの方向にどれだけ離れているかを
判定しているわけですが、これの中心軸を最初のタッチ座標に置き換えて
更に時間差で移動先の判定を加えるだけでできるような気がします。
(ま…この程度の処理なら1から書いたほうがたぶん楽。)

Java側でやるなら onFling が使えそうですが、
そこはもはやHSPではないので、JavaでAndroidアプリを開発している人が
いろいろ書いてくれてると思うので、それを参考にいじってみてください。
xyの値は上位16bit下位16bitで渡せばできるかな。



kanamaru

リンク

2015/11/16(Mon) 12:30:46|NO.73044

少し説明が足りませんでした。
取得したいのはソフトウェアキーボードのフリック入力です。
しかも、キーボードの表示非表示はhspではできません。
一度、execから呼び出せないか考えましたが…。
(パッケージ名とクラス名がわからない!)
なので、考えたのは、statにmrefを使って値をhspで入れて、
javaで検知。その上でstatに押されたキーのキーコードを代入したり、
ソフトウェアキーボードの表示非表示を制御。
といったことです。



kanamaru

リンク

2015/11/16(Mon) 12:31:45|NO.73045

追記で、この話って別スレッドのほうがいいですか?
別のスレッドのほうがいいなら、スレッド立てますが。



窓月らら

リンク

2015/11/16(Mon) 14:11:29|NO.73049

> 取得したいのはソフトウェアキーボードのフリック入力です。
あー、こっちは試してないから分からないですね。
自分のアプリで必要になれば躍起になって調べるところですが。
(うちが試してるのは、ハードウェアキーのほうね。)

スレタイとは関係ないので、別スレのほうがいいかもですね。
しってる人が答えてくれるかも。



ONION software Copyright 1997-2023(c) All rights reserved.