У меня есть AppWidget, где макет имеет LinearLayout в корне. Виджет использует фоновый 9-патч для предоставления фрейма для виджета.
Как установить альфа-канал в виджет?
Я не могу установить его напрямую, поскольку фоновый атрибут используется для указания 9-патча. Это LinearLayout не ImageView, поэтому я не могу использовать setAlpha(), поэтому как сделать его полупрозрачным?
Уровень прозрачности будет динамически изменяться, поэтому я не могу использовать полупрозрачное растровое изображение.
Насколько я вижу, единственный способ сделать это - использовать полупрозрачный drawable (возможно, 9patch), поскольку, похоже, нет способа сделать это с помощью RemoteViews.
Динамическую динамику можно настроить в RemoteViews на Android 2.2 и выше, используя изображение для отображения фона и использования метода viewAlpha для просмотра изображений.
Используйте relativelayout для позиционирования изображения позади содержимого, и в пределах изображения установите src на фоновое изображение. Обратите внимание, что я устанавливаю изображение в src, а не в фоновом режиме, поэтому я могу использовать метод setAlpha.
Макет:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MainLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/BackgroundImageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="6dip"
android:cropToPadding="true"
android:scaleType="fitXY"
android:src="@drawable/widget_background" >
</ImageView>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ContentLinearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="fill"
android:layout_marginBottom="26dip"
android:layout_marginLeft="14dip"
android:layout_marginRight="14dip"
android:layout_marginTop="14dip"
android:clickable="true"
android:clipChildren="false"
android:clipToPadding="false"
android:gravity="top|fill_horizontal"
android:orientation="horizontal" >
<TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text="loading..."
android:textSize="18dip"
android:textStyle="bold" >
</TextView>
</LinearLayout>
</RelativeLayout>
Когда вы создаете RemoteViews для отображения в виджете, вы можете использовать общий метод setInt для доступа к методу setAlpha в ImageView, например:
setInt(R.id.BackgroundImageView, "setAlpha", alpha);
Я также использую setImageViewResource для замены фонового изображения из настроек.
setImageViewResource(R.id.backgroundImageView, bgDrawable);
Посмотрите ответы на Как установить альфа-значение всего представления на уровне api 7 (Android 2.1)