将窗口小部件背景设置为以编程方式生成的渐变

时间:2015-07-21 20:50:51

标签: android android-layout android-drawable android-appwidget

我正在努力让我的小部件看起来漂亮,但小部件反击;(

我将小部件布局背景设置为生成线性渐变时遇到问题。

目前,我已经找到了如何使用该渐变的自定义“weigth”颜色生成线性渐变:

public static PaintDrawable createLinearGradient(final int left, final int top, final int right, final int bottom, 
                                                 final int[] colors, final float[] positions)
{
    ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory()
    {
        @Override
        public Shader resize(int width, int height)
        {
            LinearGradient lg = new LinearGradient(left, top, right, bottom, colors, positions, Shader.TileMode.REPEAT);
            return lg;
        }
    };

    PaintDrawable gradient = new PaintDrawable();
    gradient.setShape(new RectShape());
    gradient.setShaderFactory(shaderFactory);

    return gradient;
}

这是一种将窗口小部件背景设置为可绘制文件夹的方法:

int backgroundId =  getDrawableByName(context, "round_transparrent_background");
remoteViews.setInt(R.id.mainLayout, "setBackgroundResource", backgroundId);

我需要一种编写此命令的方法如下:

Drawable background =  createLinearGradient(params ... );
remoteViews.setInt(R.id.mainLayout, "setBackgroundResource", background);

1 个答案:

答案 0 :(得分:1)

RemoteView本质上仅限于某些功能。如果您认为传递给RemoteViews的任何信息需要跨进程传输,而不是所有类/数据类型都受支持,那么这是有道理的。

无法将任意Drawable对象传递给RemoteViews - 没有一种方法支持它,而Drawable通常不是一个可以编组数据的类流程。它适用于可绘制资源的原因是资源ID只是一个整数,Android知道如何将它们扩展为Bitmaps(用于png)或它们各自的Drawable实现(用于声明的任何内容)用XML)。

正如我所看到的,唯一可行的策略是使用Bitmap API将渐变实际绘制到Canvas并使用AppWidget中的ImageView进行操作作为背景。然后,您可以致电remoteViews.setImageViewBitmap()来设置ImageView

的内容