android - 带有一组颜色动态可绘制对象的 Android 图像按钮
问题描述
我想创建一个非常复杂的按钮,但现在当我遇到它的更多技术方面时,我不确定如何创建它。
我有一个带有自定义纹理 ( android:background
) 的 ImageButton,并在其顶部有一个自定义图像 ( android:src
)。然而,这是我想要的基本按钮,我想到的成品有 3 个额外的颜色动态绘图。本质上,每次按下按钮时,不同的可绘制对象都会“点亮”,就像电子设备上的 LED 一样。
这是我遇到障碍的地方,因为据我所知,我不能同时向一个按钮添加多个可绘制对象(并单独修改它们)。另一种选择是创建 4 种不同的纹理(切换灯光效果),并在按下按钮后切换背景图像,但这是效率最低的方法。更不用说这样做很可能会导致与可绘制内容重叠的问题。随着不同的屏幕尺寸改变按钮尺寸,可绘制内容的高度可能会与相关的“LED”重叠。
我不相信您可以将 LinearLayout 嵌套在按钮内,但这就是我的想法。否则,我听到有人谈论将线性布局制作成按钮,然后将 Button 小部件全部丢弃。与上述潜在解决方案相比,这是否值得额外的工作?
实际上,就在我写这篇文章的时候,我可以将可绘制对象包含在按钮上方或下方的单独线性布局中,但我担心这将如何影响设计。我喜欢它在按钮内部,因为它在使用空间方面更有效率。
否则,任何其他想法将不胜感激。
更新: 我已经开始实施一个版本,它使用我切换的不同背景。到目前为止,前端计算的数量(对于侦听器、更改模型信息和更改背景)似乎混淆了我的其他进程。我仍然很好奇这是否是最好的方法,或者我可能需要开始在不同的线程上进行一些计算以节省空间。
更新 #2 以下是一些实现细节供参考:
文件:
- image_led_1.jpg
- image_led_2.jpg
- image_led_3.jpg
- image_led_0.jpg //关闭
- button_img.jpg
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 中的每个按钮
解决方案
尝试这个:
Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable);
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);
使用DrawableCompat
很重要,因为它在 API 22 和更早的设备上提供向后兼容性和错误修复
推荐阅读
- javascript - this.foo = bar 和 Object.defineProperties(this
- r - 如何从R中的一列创建两列?
- javascript - 在我的网页上添加动态图像,最好使用 JavaScript (SharePoint)
- flutter - 如何在flutter Dio包中的formData中发布对象?
- if-statement - 'if 语句'(Pine)的定义问题
- python - Anaconda 的适用于 Python 的英特尔 MKL
- c++ - 使用函数、数组和 for 循环分析数据
- python - Django 自定义管理器面临的问题
- javascript - 尝试将其重定向到另一个页面时,href不起作用
- ruby-on-rails - Bundler 找不到兼容版本