2

それらのいずれかをクリックすると、同時にandroid:background複数に対して変更効果を達成する方法は?Views

内容が異なりますのでご注意ください

2 つの部分で「バッジ」レイアウトを取得しました。それらは 1 つのボタンのように機能しますが、2 つの部分には、StateListDrawable背景などを定義する異なる (セレクター)がありますstate_pressed。最初の部分は、画像を含むヘッダー (「左」) です。2 つ目は、さまざまなサブコンテンツで満たされるコンテンツ領域です。結局のところ、両方のパーツの内容にはさまざまなサイズがあります。

2 つのバッジ パーツが別々に伸び、いずれかが押されたときに共通の背景効果を共有するようにします。

<LinearLayout
    style="@style/Badge">

    <!-- LEFTER -->
    <LinearLayout
            style="@style/BadgeLefter"
            android:background="@drawable/badge_lefter_bg_blue">
            <ImageView
                    style="@style/BadgeLefterImage"
                    android:src="@drawable/office_building"/>
    </LinearLayout>

    <!-- CONTENT -->
    <LinearLayout
            android:id="@+id/badge_blue_content"
            style="@style/BadgeContent"
            android:background="@drawable/badge_content_bg_blue">
    </LinearLayout> 
</LinearLayout>

StateListDrawable背景セレクターの例(@drawable/badge_content_bg_blue上記のような):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:state_pressed="false"
    android:drawable="@drawable/badge_bg_blue_normal"/>
<item android:state_focused="false" android:state_pressed="true"
    android:drawable="@drawable/badge_bg_blue_pressed"/>
<item android:state_focused="true"
    android:drawable="@drawable/badge_bg_blue_focused"/>
<item android:state_focused="true" android:state_pressed="true"
    android:drawable="@drawable/badge_bg_blue_pressed"/>
</selector>

etcはbadge_bg_blue_normal9 パッチの png です。

私はアンドロイドが初めてです。ここで同様の質問を見つけることができませんでした。Buttonボタンには android:background が 1 つしかないため、独自のカスタマイズは役に立ちませんselector。複数の伸縮可能領域をサポートする 9 パッチは見つかりませんでした。カスタム コンポーネントを作成できることに気付きました。それは良い考えですか?

私は自分のバッジをアプリ全体で広く使用しています。エレガントなソリューションをいただければ幸いです。:)

* ソリューションの編集: *

でカスタム コンポーネントを作成しTouchListenerたら、準備は完了です: ^_^

public class Badge extends LinearLayout {
    //...
    public Badge(Context c, AttributeSet attrs) {
        super(c, attrs);
        //... 
        // inflating layouts and setting selector backgrounds here
        //... 
        setClickable(true);
        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    lefter.setPressed(true);
                    contents.setPressed(true);
                }
                else if (event.getAction() == MotionEvent.ACTION_UP || !isInside(v, event)) {
                    lefter.setPressed(false);
                    contents.setPressed(false);
                }
                return false;
            }

            private boolean isInside(View v, MotionEvent event) {
                //...
            }
        });
   }
   //...
}
4

1 に答える 1

1

私があなたの質問を正しく理解している場合、あなたには2つのボタンがあり、そのうちの1つを押すと、両方とも押されているように動作するはずですか?

ボタンの1つを押したときに、もう1つのボタンでView.setPressed(bool)関数を呼び出そうとしましたか?上記のようなデザインがあったら、そこから始めます。それが機能しない場合、別のアプローチは、ボタンの1つを押すときにすべてのボタンの背景描画可能を単に切り替えることであり、組み込みのstate_pressed機能を使用しないことです。

複数の領域で拡張可能な9パッチに関しては、AndroidSDKに含まれている9パッチツールを使用してこれを実現できます。私は自分で作ったボタンを使ってそれを行いました。このボタンには、静的な中央領域(垂直方向)と上下に2つの伸縮可能な領域があります。

于 2011-05-16T10:07:24.527 に答える