2

点击其中任何一个,如何同时实现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_normaletc 是 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) {
                //...
            }
        });
   }
   //...
}
4

1 回答 1

1

如果我正确理解您的问题,您有两个按钮,按下其中一个按钮时,它们的行为都应该像被按下一样?

按下其中一个按钮后,您是否尝试在另一个按钮上调用 View.setPressed(bool) 函数,等等?如果我有像你上面这样的设计,我会从那里开始。如果这不起作用,另一种方法可能是在按下其中一个按钮时简单地切换所有按钮上的背景可绘制对象,而根本不使用内置的 state_pressed 功能。

关于可在多个区域进行拉伸的 9-patch,您可以使用 android SDK 中包含的 9-patch-tool 来实现。我用我自己制作的一个按钮来做到这一点,它有一个静态中心区域(垂直)和上下两个可拉伸区域。

于 2011-05-16T10:07:24.527 回答