それらのいずれかをクリックすると、同時に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_normal
9 パッチの 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) {
//...
}
});
}
//...
}