KeyboardView キーが押されたときに波及効果を実装する方法を見つけようとしています。簡単に聞こえますが、他のタイプのビュー (リストビュー、ボタンなど) で機能するリップルを追加するすべての方法を試しましたが、まったく成功しませんでした。
私の目的は、Lollipop OS にデフォルトで付属しているストック電卓アプリのキーパッドのように見える数字キーパッドを作成することです。
GitHub ( https://github.com/numixproject/com.numix.calculator )に同様の電卓アプリがあり、キーパッドに波及効果がありますが、コードを読むと、代わりに数値キーのボタンを使用しているように見えますキーボード ビュー。
私のアプリには既に KeyboardView を使用したカスタム数値キーボードの実装があり、ボタンを使用するように変更する必要はありません。
keyBackground
次のようなスタイルの属性としてリップルを追加してみました:
<android.inputmethodservice.KeyboardView
android:id="@+id/numeric_keypad"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:focusableInTouchMode="true"
style="@style/my_numeric_keypad" />
次に、themes.xml で:
<style name="my_numeric_keypad">
<item name="android:keyTextSize">30dp</item>
<item name="android:fontFamily">roboto</item>
<item name="android:keyBackground">@drawable/numeric_keypad_ripple</item>
<item name="android:keyTextColor">@android:color/white</item>
</style>
そして drawable-v21 フォルダー内の numeric_keypad_ripple.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight">
<item android:drawable="@drawable/numeric_keypad_states"/>
</ripple>
keyBackground
numeric_keypad_states.xml は、押された状態の古いセレクターです (以前は、属性としてそのまま宣言されていました)。
<?xml version="1.0" encoding="UTF-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/numeric_keypad_pressed" />
<item android:drawable="@drawable/numeric_keypad_normal" />
</selector>
numeric_keypad_pressed.xml と numeric_keypad_normal.xml は、次のように、特定の状態ごとに色を付けたドローアブルです (どちらもまったく同じで、color 属性が異なるだけです)。
<?xml version="1.0" encoding="UTF-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="@color/numeric_keypad_pressed_color"/>
</shape>
</item>
</layer-list>
上記の私のアプローチはうまくいくと思いました。しかし、そうではありません。私の Lollipop デバイスでは、キーパッドを押すと、リップルのない通常の押された色が表示され、リップルのない古い実装との違いはありません。レイヤーが波紋と重なっていると思ったので外してみましたが、うまくいきません。リップルにマスクを追加しても機能しません。
また、セレクターをラップする代わりに、セレクターの押された状態のドローアブルとして、rippledrawable を使用しようとしましたが、まだ機能していません。また?android:attr/selectableItemBackground
、rippledrawable の代わりに使用しようとしましたが、機能しません。
ああ、私は実際にはネイティブの Android ではなく Xamarin でアプリを開発していますが、それは私が推測する違いにはなりません。