я использовал следующее решение:
float opacity = 0.3f; //opacity = 0: fully transparent, opacity = 1: no transparancy
int backgroundColor = 0x000000; //background color (here black)
remoteView.setInt(R.id.loMain, "setBackgroundColor", (int)(opacity * 0xFF) << 24 | backgroundColor);
loMain является основным макетом моего виджета
Если основной макет виджета использует форму фона (например, Android: фон = «@ drawable/shape_transparent»), который имеет закругленный угол, а затем это более сложное решение:
float transparency = 0.5f; //0...1
long colorFilter = 0x01000000L * (long)(255f * transparency);
try {
final Method[] declaredMethods = Class.forName("android.widget.RemoteViews").getDeclaredMethods();
final int len = declaredMethods.length;
if (len > 0) {
for (int m=0; m<len; m++) {
final Method method = declaredMethods[m];
if (method.getName().equals("setDrawableParameters")) {
method.setAccessible(true);
method.invoke(remoteView, R.id.loMain, true, -1, (int)colorFilter, PorterDuff.Mode.DST_OUT, -1);
break;
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
Вы можете играть с переменными alfa и colorFilter в соответствии с вашими потребностями.
Но я хотел бы динамически менять прозрачность. Когда пользователь выбирает прозрачность (от 0 до 1), виджет обновляется. – domen
Для этого вы можете использовать HashMap цветов, где цвет будет значением, а от 1 до 10 будет вашим ключом для этого, как второй вариант, который я дал в ответ. И установите цвет фона из этого ключа hashmap по выбору пользователя. вам нужен другой цветовой код в соответствии с прозрачностью. От черного до белого или любого другого, что вы хотите добавить. –
AndiM