on_的多个视图的state_pressed背景

时间:2011-05-12 08:17:06

标签: android android-layout android-widget selector nine-patch

如何同时对多个android:background实现Views更改效果,点击其中任何一个?

Note that contents vary

我有两个部分的“徽章”布局。它们就像一个按钮,但这两个部分有不同的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等是9-patch png。

我是android的新手。我在这里找不到类似的问题。自定义我自己的Button没有帮助,因为按钮只有一个android:background selector。我发现没有支持多个可拉伸区域的9补丁。我意识到我可以建立一个custom component。这是个好主意吗?

我在应用程序周围广泛使用我的徽章。一个优雅的解决方案将不胜感激! :)

*解决方案编辑:*

使用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) {
                //...
            }
        });
   }
   //...
}

1 个答案:

答案 0 :(得分:1)

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

按下其中一个按钮后,您是否尝试在另一个按钮上调用View.setPressed(bool)功能,依此类推?如果我的设计与你的一样,那就是我要开始的地方。如果这不起作用,另一种方法可能是在按下其中一个按钮时简单地在所有按钮上切换背景可绘制,而不是使用内置的state_pressed功能。

关于可在多个区域中伸展的9个补丁,您可以使用android SDK中包含的9-patch-tool来实现此目的。我是用自己制作的按钮做的,它有一个静态的中心区域(垂直)和两个可伸缩的区域。