【问题标题】:Setting GradientDrawable through RemoteView通过 RemoteView 设置 GradientDrawable
【发布时间】:2013-01-24 13:25:16
【问题描述】:

这是我想做的:我有一个小部件,我想根据用户选择的颜色设置它的背景。它必须是一个渐变。背景是通过设置linearLayout的背景来设置的。为了测试,我做了一个虚拟背景:

remoteViews.setInt(R.id.layout, "setBackgroundResource", R.drawable.widget_background);

我已经看到了这个问题:Call setImageDrawable from RemoteViews 但我无法理解如何实现。我什至找不到那里提到的setXYZ()。这是我到目前为止所尝试的:

  1. 动态绘制渐变。在这种方法中,我无法设置背景,因为 AFAIK 所有方法都采用可绘制对象的 id,并且我有一个可绘制对象。
  2. 尝试将 ImageView 作为背景(在 LinearLayout 之前)。它没有为小部件提供适当的边距。由于小部件文本是动态的,有时它会超出我想要的 imageView 之外

  3. 制作我拥有的 bg.xml:

    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
           <padding
                android:bottom="1dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
           <corners
                android:bottomLeftRadius="7dp"
                android:bottomRightRadius="7dp"
                android:topLeftRadius="7dp"
                android:topRightRadius="7dp" />
    </shape>
    

现在我完全糊涂了。有人可以尽快提供帮助(可能更多的代码和更少的链接)吗?另外,请不要像已经问过的那样结束这个问题

【问题讨论】:

  • LinearLayout 下使用ImageView 作为背景层怎么样?
  • 我试过了,但忘了提。它没有为小部件提供适当的边距。由于小部件文本是动态的,因此有时它会超出我想要的 imageView

标签: android drawable


【解决方案1】:

尝试将 ImageView 作为背景(在 LinearLayout 之前)。它没有为小部件提供适当的边距。由于小部件文本是动态的,有时它会超出我想要的 imageView 之外

我不完全确定您的意思,但是如果您使用 FrameLayout / RelativeLayout 作为根布局,然后将 ImageView 放入其中并填充父级,则您的图像应该与小部件的大小完全相同。

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="6dp" >

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

    // Other views

</FrameLayout>

另外,我正在这样做以动态更改圆角渐变背景的颜色和 alpha。然后使用 setImageViewBitmap( ) 应用到 imageview。可能有更好的方法。

public static Bitmap getBackground(int bgColor, int width, int height, Context context) {
    try {
        // convert to HSV to lighten and darken
        int alpha = Color.alpha(bgColor);
        float[] hsv = new float[3];
        Color.colorToHSV(bgColor, hsv);
        hsv[2] -= .1;
        int darker = Color.HSVToColor(alpha, hsv);
        hsv[2] += .3;
        int lighter = Color.HSVToColor(alpha, hsv);

        // create gradient useng lighter and darker colors
        GradientDrawable gd = new GradientDrawable(
                GradientDrawable.Orientation.LEFT_RIGHT,new int[] { darker, lighter});
        gd.setGradientType(GradientDrawable.RECTANGLE);
        // set corner size
        gd.setCornerRadii(new float[] {4,4,4,4,4,4,4,4});

        // get density to scale bitmap for device
        float dp = context.getResources().getDisplayMetrics().density;

        // create bitmap based on width and height of widget
        Bitmap bitmap = Bitmap.createBitmap(Math.round(width * dp), Math.round(height * dp),
                Bitmap.Config.ARGB_8888);
        Canvas canvas =  new Canvas(bitmap);
        gd.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        gd.draw(canvas);
        return bitmap;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多