0

私の問題は次のとおりです。

私はImageView背景を持つを持っています。背景は、状態に応じて異なる画像を描画するドローアブルです。

context_menu_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- Focused -->
<item android:drawable="@drawable/button_round_focused" 
    android:state_focused="true"/>

<!-- Pressed -->
<item android:drawable="@drawable/button_round_focused" 
    android:state_pressed="true"/>

<!-- Normal -->
<item android:drawable="@android:color/transparent"/>

</selector>

次にstar icon、これcontext_menu_buttonを背景として適用します。

<ImageView
    android:id="@+id/btnStar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/context_menu_button"
    android:focusable="true"
    android:src="@drawable/icon_star"  />

この画像button_round_focusedは非常に微妙なグラデーションを持つ画像であるため、実際には非常に大きくなっています。通常の状態では画像(透明色)はありません。上記の XML は次のようになります (フォーカスされた状態)。

星のアイコン

この背景のサイズが問題を引き起こしています。星のアイコンをペイントするとき、アイコンの星の面積を計算するために背景が考慮されます。そのため、このアイコンに似たアイコンを 2 つ以上並べると、互いに非常に離れてしまいます。

<ImageView
    android:id="@+id/btnStar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/context_menu_button"
    android:focusable="true"
    android:src="@drawable/icon_star" />

<ImageView
    android:id="@+id/btnShare"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/context_menu_button"
    android:focusable="true"
    android:src="@drawable/icon_share" />

<ImageView
    android:id="@+id/btnRate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/context_menu_button"
    android:focusable="true"
    android:src="@drawable/icon_rate" />

スターシェア率

私の解決策は、左の負のマージンを設定することでした。

負のマージンを持つ星シェア率

ただし、このソリューションは別の問題を引き起こしました。アイテムが重なっています。

スターオーバーラップ

シェアオーバーラップ

レートオーバーラップ

たとえば、アイテムの共有 (中央のボタン) をクリックしようとすると、実際には 3 番目のボタンがクリックされます。

私の理想的な解決策は、適用されたアイテムの面積を計算するために、適用された背景ImageViewが考慮されていないことです。このようなもの:

範囲外の背景を持つスター

つまり、背景が の領域からはみ出す可能性がありImageViewます。

これで問題は解決すると思いますが、ドキュメントを読んでいますが、これに関連するものは何も見つかりませんでした。他のアイデアをいただければ幸いです (ただし、背景のサイズを変更することはできません)。

ご協力いただきありがとうございます。

4

1 に答える 1

0

最後に、私はこの問題を解決することができました。私がしたことは次のとおりです。

1) ボタンから背景を削除しました。

背景がこの問題の根本的な理由でした。バックグラウンドがなければ、すべてが期待どおりに機能していました。

2)フォーカスされたとき、またはクリックされたときに、背後の背景とアイコンをプログラムで表示するように管理しました。

これを行うために、最初に行ったのはレイアウトの変更でした。すべてのアイコン (スター、シェア、レート) をFrameLayout. また、描画可能な button_round_focused を含む ImageView を追加しました (上記のハロー)。アイデアは、アイコンがフォーカスされたときにこの画像を正しいアイコンに移動することです。画像はアイコンの前にあるため、Z インデックスが低くなり、アイコンの後ろに描画されます。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="85dp"
    android:gravity="left|center_vertical" >

    <ImageView
        android:id="@+id/button_round_focused"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/button_round_focused"
        android:visibility="invisible" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >

        <!-- Favorite button -->

        <ImageView
            android:id="@+id/btnFav"
            style="@style/MediaDetailsStarButton"
            android:contentDescription="@string/star" />

        <!-- Share button -->

        <ImageView
            android:id="@+id/btnShare"
            style="@style/MediaDetailsShareButton"
            android:contentDescription="@string/share" />

        <!-- Rate button -->

        <ImageView
            android:id="@+id/btnRate"
            style="@style/MediaDetailsRateButton"
            android:contentDescription="@string/to_rate" />
    </LinearLayout>

</FrameLayout>

レイアウトを再定義した後、必要に応じてハローを正しい位置に移動するロジックをプログラムしました。アイコンがフォーカスされたときに移動するのは比較的簡単でした。OnFocusChangeListener次のようにすべてのアイコンに を付けました。

icon.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            btnRoundFocused.setX(center(v));
            btnRoundFocused.setVisibility(View.VISIBLE);
        } else {
            btnRoundFocused.setVisibility(View.INVISIBLE);
        }
    }
});

メソッドcenter()は の正しい X 座標を計算するbtnRoundFocusedため、アイコンと背景の両方が中央に配置されます。

private float center(View v) {
    int middle = btnRoundFocused.getWidth() / 2;
    return v.getX() + (v.getWidth() / 2) - middle;
}

次に、アイコンがクリックされたときに同じことをしました。これはもっと大変でした。私がしなければならなかったのは、アイコンがクリックされたときに、背景をしばらく表示してから非表示にすることでした。

private void withButtonPressed(View v, IButtonAction action) {
    buttonPressed(v);
    action.execute(v);
    buttonUnpressed(v);
}

protected void buttonPressed(View v) {
    btnRoundFocused.setX(center(v));
    btnRoundFocused.setVisibility(View.VISIBLE);
    v.setActivated(true);
}

protected void buttonUnpressed(final View v) {
    new Handler().post(new Runnable() {

        private final int ELLAPSE_TIME = 250;

        @Override
        public void run() {
            try {
                Thread.sleep(ELLAPSE_TIME);
                v.setActivated(false);
                btnRoundFocused.setVisibility(View.INVISIBLE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
}

interface IButtonAction {
    void execute(View v);
}

withButtonPressed()を受け取るメソッドを定義しましたIButtonActionIButtonAction対応するアイコン (スター、シェア、レート) のビジネス ロジックを実装します。withButtonPressed() は、背景を正しい位置に設定し、背景をしばらく (250 ミリ秒) 表示してから、再び非表示にします。

最後に、アイコン (*icon_share.xml* など) のドローアブルに新しい状態 (アクティブ化) を追加する必要もありました。アイコンは、その状態に応じて複数のドローアブルを持つ XML です (アイコンがフォーカスまたはクリックされたときは黒色のアイコン、通常の状態では灰色のアイコン)。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Activated -->
    <item android:drawable="@drawable/ico_share_focused"
        android:state_activated="true"/>

    <!-- Focused -->
    <item android:drawable="@drawable/ico_share_focused" 
        android:state_focused="true"/>

    <!-- Normal -->
    <item android:drawable="@drawable/ico_share"/>

</selector>

そしてそれだけでした。この問題を解決するためのより良い方法があるかどうかはわかりませんが、少なくともこれは機能しました。同様の問題に直面している他の人々に役立つことを願っています。

于 2013-07-30T21:34:50.163 に答える