点击其中任何一个,如何同时实现android:background
多个更改效果Views
?
我得到了一个分为两部分的“徽章”布局。它们就像一个按钮,但是这两个部分具有不同的StateListDrawable
(选择器)定义背景state_pressed
等。第一部分是带有图像的标题(“左侧”)。第二个是充满各种子内容的内容区域。这一切都归结为这两个部分的内容都有不同的大小。
我希望两个徽章部分分别拉伸并在按下任何一个时共享一个共同的背景效果。
<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
etc 是 9-patch png。
我是安卓新手。我没有在这里找到类似的问题。自定义我自己的按钮没有帮助,Button
因为按钮只有一个 android:background selector
。我发现没有 9-patch 支持多个可拉伸区域。我意识到我可以构建一个自定义组件。这是个好主意吗?
我在应用程序中广泛使用我的徽章。一个优雅的解决方案将不胜感激!:)
*解决方案编辑:*
在构建一个自定义组件后,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) {
//...
}
});
}
//...
}