Как добиться эффекта android:background
изменения для нескольких Views
одновременно, щелкнув по любому из них?
Я получил макет «значок» из двух частей. Они действуют как одна кнопка, но две части имеют разные StateListDrawable
(селекторы), определяющие фоны для state_pressed
и т. Д. Первая часть - это заголовок («lefter») с изображением. Второе - это область контента, которая заполняется различными подконтентами. Все сводится к тому, что содержимое обеих частей бывает разных размеров.
Я хочу, чтобы две части значка растягивались отдельно и имели общий фоновый эффект при нажатии любой из них.
<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>
, где badge_bg_blue_normal
и т. Д. - это png с 9 патчами.
Я новичок в Android. Мне не удалось найти подобный вопрос здесь. Это не помогает настроить мой собственный Button
, потому что кнопки имеют только один Android: фон 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) {
//...
}
});
}
//...
}