我在为小部件设置动态背景时遇到麻烦:

我的偏好设置返回用户选择的颜色,我想将其应用于小部件,但具有渐变效果。所以这是我现在的位置:

我的widget.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/style_widget"
> ...

我的Service.java:
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);

    remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget);
    this.prefs = PreferenceManager.getDefaultSharedPreferences(this);

    //this is where I get the color preference value, and create another with some transparency

    int color1 = prefs.getInt("background_color", 00000000);
    int color2 = Color.argb(22, Color.red(color1), Color.green(color1), Color.blue(color1));

    int colors[] = { color1, color2 };

            //Create the GradientDrawable:
    GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, colors);

如果我做 :
remoteViews.setInt(R.id.widget_layout, "setBackgroundColor", color1);

我更改了背景颜色,但是由于gradientDrawable不是int,如何通过remoteViews将其应用于背景?

最佳答案

好吧,我在这里找到了答案:

Setting GradientDrawable through RemoteView

我创建了一个填充整个窗口小部件的Imageview,然后使用我的gradientDrawable创建了一个位图,然后将该位图设置为imageview:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/style_widget"
android:padding="0dip" >

<ImageView
        android:id="@+id/bck_image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="fitXY"
    />

然后在我的服务中:
GradientDrawable gradientDrawable = new GradientDrawable(
                    GradientDrawable.Orientation.LEFT_RIGHT, colors);

float dpi = getBaseContext().getResources().getDisplayMetrics().xdpi;
float dp = getBaseContext().getResources().getDisplayMetrics().density;

Bitmap bitmap = Bitmap.createBitmap(Math.round(288 * dp), Math.round(72 * dp), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
gradientDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
gradientDrawable.setCornerRadius(5 * (dpi/160));
gradientDrawable.draw(canvas);
remoteViews.setImageViewBitmap(R.id.bck_image, bitmap);

(我对Android还是很陌生,所以我不知道代码的格式是否正确,但对我来说它是可行的,以防万一它可以帮助任何人。)

10-05 17:42