首页 > 解决方案 > 带有一组颜色动态可绘制对象的 Android 图像按钮

问题描述

我想创建一个非常复杂的按钮,但现在当我遇到它的更多技术方面时,我不确定如何创建它。

我有一个带有自定义纹理 ( android:background) 的 ImageButton,并在其顶部有一个自定义图像 ( android:src)。然而,这是我想要的基本按钮,我想到的成品有 3 个额外的颜色动态绘图。本质上,每次按下按钮时,不同的可绘制对象都会“点亮”,就像电子设备上的 LED 一样。

这是我遇到障碍的地方,因为据我所知,我不能同时向一个按钮添加多个可绘制对象(并单独修改它们)。另一种选择是创建 4 种不同的纹理(切换灯光效果),并在按下按钮后切换背景图像,但这是效率最低的方法。更不用说这样做很可能会导致与可绘制内容重叠的问题。随着不同的屏幕尺寸改变按钮尺寸,可绘制内容的高度可能会与相关的“LED”重叠。

我不相信您可以将 LinearLayout 嵌套在按钮内,但这就是我的想法。否则,我听到有人谈论将线性布局制作成按钮,然后将 Button 小部件全部丢弃。与上述潜在解决方案相比,这是否值得额外的工作?

实际上,就在我写这篇文章的时候,我可以将可绘制对象包含在按钮上方或下方的单独线性布局中,但我担心这将如何影响设计。我喜欢它在按钮内部,因为它在使用空间方面更有效率。

否则,任何其他想法将不胜感激。

更新: 我已经开始实施一个版本,它使用我切换的不同背景。到目前为止,前端计算的数量(对于侦听器、更改模型信息和更改背景)似乎混淆了我的其他进程。我仍然很好奇这是否是最好的方法,或者我可能需要开始在不同的线程上进行一些计算以节省空间。

更新 #2 以下是一些实现细节供参考:

文件:

XML 布局(示例按钮):

    <ImageButton
            android:id="@+id/ledButton1"
            android:background="@drawable/image_led_1"
            android:layout_width="0dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:scaleType="fitCenter"
            android:src="@drawable/contentImage"
            app:layout_column="0"
            app:layout_columnWeight="2"
            app:layout_row="0" />

听众:

    private View.OnClickListener ledButtonListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int position = (int) view.getTag();  // Get position in RecyclerView
            MyClass foo = fooArray.get(position);

            foo.a = (foo.a < 3) ? foo.a + 1 : 0;
            int resourceID = getContext().getResources().getIdentifier(
                    "led_Button_" + Integer.toString(foo.a),
                    "drawable",
                    getActivity().getPackageName());
            view.setBackgroundResource(resourceID);
            activity.MyAppEngine.updateFooArray(position, foo.a);
        }
    };

此侦听器附加到 Adapter 类中 RecyclerView 中的每个按钮

标签: androidtexturesandroid-drawableandroid-imagebutton

解决方案


尝试这个:

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED); 

使用DrawableCompat很重要,因为它在 API 22 和更早的设备上提供向后兼容性和错误修复


推荐阅读