我怎样才能为9补丁图像着色?

时间:2011-10-14 22:26:52

标签: android

我已经学会了如何通过添加一个OnTouchListener来对图像进行着色,我在图像上调用了setColorFilter。

我已经学会了如何使用九个补丁图像作为按钮和图像按钮的背景。

问题是,如果九路径图像是ImageButton的src,则它们不会拉伸,并且色调对背景图像没有影响。

如何按下九个补丁的ImageButton?有什么建议吗?

5 个答案:

答案 0 :(得分:7)

我知道这是一个古老的问题,但它似乎是这个话题中唯一的问题。

您可以通过创建包含九个补丁节点和一个色调节点的xml资源文件来着色九个补丁图像。示例:

<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/nine_patch_image"
        android:tint="@android:color/black"/>

然后,您可以在后台属性中引用此文件:

<LinearLayout
    android:id="@+id/some_id"
    android:background="@drawable/xml_filename">

希望这会有所帮助

答案 1 :(得分:2)

所以我迟了3年但我找到了办法。 (我正在使用Xamarin,所以请原谅我想念的任何C#格式)

@Override
protected void onDraw(Canvas canvas)
    {
        NinePatchDrawable bg = (NinePatchDrawable)getResources().getDrawable(R.Drawable.whatev);
        bg.setBounds(0, 0, getWidth(), getHeight());
        bg.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
        bg.draw(canvas);
        base.onDraw(canvas);
    }

答案 2 :(得分:1)

另一种选择是使用backgroundTint(在API21及更高版本上可用):

            <TextView
            android:id="@+id/chat_bubble_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/left_bubble"
            android:backgroundTint="@color/main_color"
            android:gravity="center_vertical"
            android:minWidth="200dp"
            android:textColor="@android:color/white"
            android:visibility="visible"
            tools:text="message" />

答案 3 :(得分:0)

我找到了一种方法可以做到这一点。使用纯灰度,半透明9补丁图像作为按钮背景,将按钮包裹在视图组中,其颜色为 背景,如下所示:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#F00"
    android:orientation="vertical" >
    <Button
        android:id="@+id/my_butt"
        android:background="@drawable/my_semi_transparent_gray_9_patch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I'm a tinted 9-patch button!" />
</LinearLayout>

主要问题是,如果你的图像有透明边缘,色调颜色会显示你不想要它的位置,但是如果你的图像边缘使用了一个完全不透明的颜色,它匹配你放入这个东西的任何容器的背景在,它可能运作良好。您可能还需要编写自己的选择器,为您关注的每个状态更改这些背景颜色。我不推荐这种方法,但也许它可以帮助某人。我同意很遗憾,9色补丁设计中没有内置着色,因为保持一堆相同的图像仅仅在色彩上有所不同感觉很愚蠢,特别是当你将它乘以许多不同的可绘制尺寸时。更好的是Android本身支持SVG。我已经修改了开源“svg-android”库,因此使用正确的艺术我只需要一个可以根据需要拉伸和着色的图像。

答案 4 :(得分:-1)

我认为通过为每个按钮状态创建单独的资源可以获得更好的结果。例如,您可以创建一个可绘制的xml文件,如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_pressed" 
        android:state_pressed="true" />
    <item android:drawable="@drawable/btn_focused"
        android:state_pressed="false"
        android:state_focused="true" />
    <item android:drawable="@drawable/btn_default"
        android:state_focused="false"
        android:state_pressed="false" />
</selector>

然后为您的按钮创建一个样式:

<style name="PushButton">
    <item name="android:background">@drawable/btn</item>
</style>

然后你应该能够设置图像按钮的样式并将src设置为你想要的任何图像。

<ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/icon"
        style="@style/PushButton" />