3

これが私がやりたいことです:私はウィジェットを持っていて、ユーザーの色の選択に応じてその背景を設定したいと思います。グラデーションである必要があります。背景は、linearLayoutの背景を設定して設定します。テストのために、私はダミーの背景に対して次のようにそれを行いました:

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

私はこの質問を見ました:RemoteViewsからsetImageDrawableを呼び出しますが、実装方法を理解できません。そこに書かれているように私も見つけることができませんsetXYZ()。これが私が今まで試したことです:

  1. グラデーションを動的に描画可能にします。このアプローチでは、すべてのメソッドがドローアブルの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>
    

今、私は完全に混乱して立ち往生しています。誰かができるだけ早く(おそらくより多くのコードとより少ないリンク)を助けることができますか?また、すでに尋ねられたように、この質問を閉じないでください。

4

1 に答える 1

5

背景として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>

また、これは、角の丸いグラデーションの背景の色とアルファを動的に変更するために行っていることです。次に、setImageViewBitmap( ) を使用してイメージビューに適用します。おそらくもっと良い方法があります。

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;
    }
}
于 2013-01-12T08:24:48.783 に答える