【发布时间】:2020-02-23 10:23:41
【问题描述】:
我想创建一个非常复杂的按钮,但现在当我遇到它的更多技术方面时,我不确定如何创建它。
我有一个带有自定义纹理 (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 中的每个按钮
【问题讨论】:
标签: android textures android-drawable android-imagebutton