11

Webサービスから受け取ったデータから動的に生成しているフォームがあります。このWebサービスは、入力要素の作成に使用する必要のある画像を提供します。の設定に問題progressDrawableがありRatingBarます。XMLですが、次のものを使用してカスタムイメージを適用できますprogressDrawable

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+android:id/background" android:drawable="@drawable/custom_star" />
    <item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/custom_star" />
    <item android:id="@+android:id/progress" android:drawable="@drawable/custom_star" />
</layer-list>

ここcustom_starで、は単純な.png画像であり@android:style/Widget.RatingBar、RatingBarスタイルとして使用されます。これは正常に機能します。

作業開始

しかし、私はcustom_star動的に変更したいと思っています。

コードでは、ビットマップを直接使用して進行状況の描画可能を設定しようとしました。

Drawable d = new BitmapDrawable(getResources(), downloadedImage);
ratingBar.setProgressDrawable(d);

また、layer-list:を作成することによって

LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {
    getResources().getDrawable(R.drawable.custom_star),
    getResources().getDrawable(R.drawable.custom_star),             
    getResources().getDrawable(R.drawable.custom_star)
});

layerDrawable.setId(0, android.R.id.background);
layerDrawable.setId(1, android.R.id.secondaryProgress);
layerDrawable.setId(2, android.R.id.progress);

ratingBar.setProgressDrawable(layerDrawable);

どちらも私にはうまくいきません。どちらの場合も、 :custom_starの寸法によって引き伸ばされたドローアブルが1回表示されます。RatingBar

ここに画像の説明を入力してください

何か案は?

アップデート:

以下のLuksprogの回答は改善されましたが、まだいくつかの問題があります。これで、スタードローアブルは引き伸ばされず、タッチで値を設定できますが、3/5を選択するとそのように表示されます。

二次なし

および5/5が選択されました:

星が多すぎる

画像の拡大縮小はいくつかの調整で修正できると思いますが、迷惑なことに、secondaryProgressドローアブルが設定されていないようです。ドローアブルは、グレー表示された選択されていない星に使用されます。それがなければ、それはあまり使い物になりません。

4

3 に答える 3

12

何か案は?

デフォルトprogressDrawableまたはテーマを介したセットを使用する場合、 (より正確にはスーパークラスの)ウィジェットprogressDrawableのコンストラクターの場合と同様に、メソッドが呼び出されて、そのドローアブルから「タイルを作成」​​します。このメソッドを使用する場合、これは発生しません。単純なまたは(単純な)を渡すと、ウィジェットの背景領域(表示されているもの)をカバーするように単純に引き伸ばされます。RatingBarProgressBarsetProgressDrawableBitmapDrawableLayerDrawableBitmapDrawablesDrawable

それを機能させるには、最初に行うことを手動で行う必要がありRatingBar、使用するタイルと一緒にタイルを作成しClipDrawablesます。ProgressBarウィジェットのソースコードに従って、このためのメソッドを作成しました。

private Drawable buildRatingBarDrawables(Bitmap[] images) {
    final int[] requiredIds = { android.R.id.background,
            android.R.id.secondaryProgress, android.R.id.progress };
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
    Drawable[] pieces = new Drawable[3];
    for (int i = 0; i < 3; i++) {
        ShapeDrawable sd = new ShapeDrawable(new RoundRectShape(
                roundedCorners, null, null));
        BitmapShader bitmapShader = new BitmapShader(images[i],
                Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
        sd.getPaint().setShader(bitmapShader);
        ClipDrawable cd = new ClipDrawable(sd, Gravity.LEFT,
                ClipDrawable.HORIZONTAL);
        if (i == 0) {
            pieces[i] = sd;
        } else {
            pieces[i] = cd;
        }
    }
    LayerDrawable ld = new LayerDrawable(pieces);
    for (int i = 0; i < 3; i++) {
        ld.setId(i, requiredIds[i]);
    }
    return ld;
}

次にLayerDrawable、このメソッドによって返されたメソッドをメソッドとともに使用しますsetProgressDrawable。状態ビットマップの1つのRatingBar幅に星の数を掛けた幅を設定するため、適切な量の星を表示するには、これも計算する必要があります。

于 2013-02-23T20:16:10.160 に答える
0

IDが間違っているため、@ android:id / background @ android:id / secondserProgress @ android:id/progressを設定する必要があります

カスタマイズを含むxmlでドローアブルを定義することもできます

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+android:id/background"
          android:drawable="@drawable/star_empty" />
    <item android:id="@+android:id/secondaryProgress"
          android:drawable="@drawable/star_empty" />
    <item android:id="@+android:id/progress"
          android:drawable="@drawable/star_full" />
</layer-list>

setMaxまた、RatingBarオブジェクトで使用して、表示できる星の最大数を設定できます

于 2013-10-02T13:02:02.493 に答える
0

このようなソリューションを使用すると、はるかに簡単になります。

RatingBar ratingBar = new RatingBar(new ContextThemeWrapper(context, R.style.AppTheme_RatingBar), null, 0);
于 2015-05-05T11:41:53.943 に答える