我目前正在开发的应用程序使用了很多ImageViews作为按钮.这些按钮上的图形使用Alpha通道淡出按钮的边缘,使它们看起来不规则.目前,我们必须为每个按钮生成2个图形(1个用于选定/聚焦/按下状态,另一个用于默认的未选择状态),并使用XML文件中为每个按钮定义的StateListDrawable.
虽然这很好用但看起来非常浪费,因为所有选定的图形都只是未选定按钮的着色版本.这些花费时间来制作(无论多少)并占用最终APK中的空间.似乎应该有一个简单的方法来自动.
看起来,完美的解决方案是为每个按钮使用ImageViews,并在其tint属性中指定ColorStateList.这种方法的优点是,所有按钮(共享相同色调)只需要一个XML ColorStateList.但它不起作用.如前所述这里,ImageView的抛出NumberFormatException异常时提供给色调值以外的任何其他单一颜色.
我的下一次尝试是为选定的drawable使用LayerDrawable.在图层列表中,我们将原始图像放在堆栈底部,由半透明矩形覆盖.这适用于按钮图形的实体部分.然而,应该是完全透明的边缘现在与顶层的颜色相同.
有没有人遇到过这个问题,找到了合理的解决方案?我想坚持使用XML方法,但可能会编写一个简单的ImageView子类,它将在代码中进行所需的着色.
我知道许多操作系统在文件系统上执行某种锁定以防止视图不一致.Java和/或Android是否保证文件访问的线程安全性?在我继续编写并发代码之前,我想尽可能多地了解这一点.
如果我错过了一个回答类似的问题,请随时关闭此主题.谢谢.
大家好.所以这里是交易.我有一个Java程序运行C++程序.C++进程通过简单地使用一些指针转换调用std :: cout上的write来向Java程序发送一些双精度数.Java程序使用Process的getInputStream(),读取8个字节,并使用一些字节移位和Double.longBitsToDouble()将它们转换为double.我确保两个应用程序之间的类型大小和字节顺序匹配.现在,虽然这在大多数情况下都有效,但每次都会发生错误.
我已将其中一个错误隔离到一个简单的字节序列,我似乎无法正确传输.请查看以下代码段:
#include <iostream>
int main(int argc, char** argv) {
long long l = 0x4048e398b90ae1b6;
char* ptr = (char*) &l;
std::cout.write(ptr, 8);
std::cout.flush();
// for (int i = 0; i < 8; ++i)
// std::cout.put(ptr[i]);
// std::cout.flush()
}
Run Code Online (Sandbox Code Playgroud)
和Java应用程序:
public static void main(String[] argv) throws IOException {
Process p = Runtime.getRuntime().exec("prog.exe");
InputStream is = p.getInputStream();
for (int i = 0 ; i < 8; ++i) {
System.err.print(Long.toHexString(is.read()) + " ");
}
}
Run Code Online (Sandbox Code Playgroud)
这些是非常简单的示例,但它们用于演示我的问题.当我在Windows 7机器上运行它时.我得到以下Java输出:
b6 e1 d a …Run Code Online (Sandbox Code Playgroud)