質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

3211閲覧

Android フリック入力

rei-

総合スコア11

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/04/21 11:09

編集2017/04/24 05:45

フリック入力が行えるキーボードを作成しています。

##現状、やりたいこと
以下はIMEのメインのコードです。
現状では「あ」を押すと「あ」が入力できます。
今後は「あ」を押した後フリックであ行が入力できる、一般的な日本語フリック入力を実装したいです。

public class InputIME extends InputMethodService implements KeyboardView.OnKeyboardActionListener{ private KeyboardView kv; private Keyboard keyboard; @Override public View onCreateInputView(){ kv = (KeyboardView)getLayoutInflater().inflate(R.layout.input_keyboard, null); keyboard = new Keyboard(this, R.xml.input_keyboard); kv.setKeyboard(keyboard); kv.setOnKeyboardActionListener(this); return kv; } @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { if(primaryCode == Keyboard.KEYCODE_DELETE){ keyDownUp(KeyEvent.KEYCODE_DEL); }else if(primaryCode == Keyboard.KEYCODE_SHIFT){ keyDownUp(KeyEvent.KEYCODE_SHIFT_RIGHT); }else if(primaryCode == Keyboard.KEYCODE_DONE){ keyDownUp(KeyEvent.KEYCODE_ENTER); }else if(primaryCode == Keyboard.EDGE_LEFT){ keyDownUp(KeyEvent.KEYCODE_DPAD_LEFT); }else if(primaryCode == Keyboard.EDGE_RIGHT){ keyDownUp(KeyEvent.KEYCODE_DPAD_RIGHT); }else if(primaryCode == InputCode.NONE){ getCurrentInputConnection().commitText("", 1); }else if(primaryCode == InputCode.A){ getCurrentInputConnection().commitText("あ", 1); }else if(primaryCode == InputCode.KA){ getCurrentInputConnection().commitText("か", 1); }else if(primaryCode == InputCode.SA){ getCurrentInputConnection().commitText("さ", 1); }else if(primaryCode == InputCode.TA){ getCurrentInputConnection().commitText("た", 1); }else if(primaryCode == InputCode.NA){ getCurrentInputConnection().commitText("な", 1); }else if(primaryCode == InputCode.HA){ getCurrentInputConnection().commitText("は", 1); }else if(primaryCode == InputCode.MA){ getCurrentInputConnection().commitText("ま", 1); }else if(primaryCode == InputCode.YA){ getCurrentInputConnection().commitText("や", 1); }else if(primaryCode == InputCode.RA){ getCurrentInputConnection().commitText("ら", 1); }else if(primaryCode == InputCode.WA){ getCurrentInputConnection().commitText("わ", 1); }else{ //文字の割り当てのあるKEYCODEの場合 getCurrentInputConnection().commitText(String.valueOf((char)primaryCode), 1); } } private void keyDownUp(int keyEventCode) { getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode)); getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyEventCode)); } @Override public boolean onKeyDown(int keyCode, KeyEvent event){ return super.onKeyDown(keyCode, event); } @Override public void onText(CharSequence text) { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeDown() { } @Override public void swipeUp() { } }

##問題点
まずタッチ座標を取得しようと以下のコードを書きました。
デバックすると最初にactivity_main(Hello worldとだけ書かれた画面)が開き、その画面上では座標を取得できました。
しかし、この画面を閉じてメモアプリなどで自作のIMEを開くと座標が取得できなくなってしまいます。
IME上で座標を取得するにはどうしたら良いでしょうか。
エラーなどははかれていません。

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onTouchEvent(MotionEvent event){ String action=""; switch(event.getAction()){ case MotionEvent.ACTION_DOWN: action ="ACTION_DOWN"; break; case MotionEvent.ACTION_UP: action="ACTION_UP"; break; case MotionEvent.ACTION_MOVE: action="ACTION_MOVE"; break; case MotionEvent.ACTION_CANCEL: action="ACTION_CANCEL"; break; } Log.v("MotionEvent","action=" + action + "," + "x="+String.valueOf(event.getX())+","+"y="+String.valueOf(event.getY())); return super.onTouchEvent(event); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

http://stackoverflow.com/questions/30787066/retrieve-x-and-y-coordinates-of-a-key-in-android

このページを参考に実装することができました。

投稿2017/04/25 09:13

rei-

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず @Override がありません。

投稿2017/04/21 23:35

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rei-

2017/04/24 01:37

ありがとうございます。 追加しました。引き続きなにかありましたらご指摘いただけると嬉しいです。
Zuishin

2017/04/24 01:50

どういう問題があるのか、どういう手順を行うとどう動作するのか、求める動作はどのようなものか、エラーメッセージの詳細などを質問に追記してください。
rei-

2017/04/24 02:52

追加しました。プログラミングの知識が薄いため、ご指摘いただければその他必要な情報も追記します。
Zuishin

2017/04/24 02:58

タッチイベントが MainActivity に関連付けられていますので、MainActivity がないと使えないと思います。
rei-

2017/04/24 05:48

keyboardに関連付けるには setContentView(R.layout.activity_main); ↓ setContentView(R.layout.input_keyboard); ということでしょうか…
rei-

2017/04/25 09:13

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問