我已经学会了如何通过添加一个OnTouchListener来对图像进行着色,我在图像上调用了setColorFilter。
我已经学会了如何使用九个补丁图像作为按钮和图像按钮的背景。
问题是,如果九路径图像是ImageButton的src,则它们不会拉伸,并且色调对背景图像没有影响。
如何按下九个补丁的ImageButton?有什么建议吗?
答案 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" />