5

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>

keyBackgroundnumeric_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 でアプリを開発していますが、それは私が推測する違いにはなりません。

4

3 に答える 3

3

それに対する私の回答は次のとおりです。それを行うための方法(つまり、簡単な方法)はまだ実装されていません。しかし、私たちはオープンソース技術について話しているので...

時間と忍耐力があれば、オリジナルからカスタム KeyboardView を作成して、デフォルト コンポーネントがリップル互換レイアウトでビューを作成する方法を再定義できます。

「問題を解決できない場合は、問題を変更してください」 (ヘンリー フォード)。

于 2015-06-18T08:57:20.580 に答える