41

レーティングバーの星の間にスペースを挿入する必要があります。たとえば、レーティングバーは適切です。

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

しかし、私はそれが必要です:

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

どうすればこれを行うことができますか?

4

6 に答える 6

6

それがもう役立つかどうかはわかりませんが、プログラムで、XMLで(他のものの中でも)星の間のスペースを変更できるカスタムライブラリを作成しました:SimpleRatingBar

それは特徴です:

  • 完全に機能する: 、またはabritarydpandroid:layout_widthに設定できます。wrap_contentmatch_parent
  • 任意の数の星。
  • 任意のステップサイズ。
  • 星のサイズは、正確に制御することも、最大サイズを設定することによって制御することもできます。
  • 通常の状態でカスタマイズ可能な色(星と評価バーの境界線、塗りつぶし、背景)。
  • 押された状態でカスタマイズ可能な色(星と評価バーの境界線、塗りつぶし、背景)。
  • 星の間のカスタマイズ可能なサイズの分離。
  • 星のカスタマイズ可能な境界線の幅。
  • カスタマイズ可能な星の角の半径。
  • OnRatingBarChangeListenerを設定できます
  • 星の塗りつぶしは、左から右または右から左に開始するように設定できます(RTL言語サポート)。
  • ビューに統合されたAnimationBuilderは、アニメーションを使用してプログラムで評価を設定します。

これがそのプレビューです

あなたの場合、あなたはただする必要があるでしょう:

ratingbar.setStarsSeparation(20, Dimension.DP);

または、たとえば、ピクセル単位で:

ratingbar.setStarsSeparation(100, Dimension.PX);

jcenterまたはで見つけることができますMaven Central。したがって、build.gradleファイルに依存関係を追加するだけです。

compile 'com.iarcuschin:simpleratingbar:0.1.+'

于 2016-11-22T03:30:30.987 に答える
4

次の物件があります。

android:progressDrawable = "@drawable/rating_stars"
android:indeterminateDrawable = "@drawable/rating_stars"

@ drawable / ratio_stars:

<?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" />
</layer-list>

star_emptyとstarは、ドローアブルディレクトリにある画像です。したがって、グラフィックエディタでstarとstar_emptyを変更し、必要に応じてspassingを追加できます。

于 2012-07-11T12:34:18.160 に答える
1

カスタムアイコンを使用し、スタイルを使用します。つまり、Photoshopを使用して、見た目が良く、システム評価スタイルアイコンに置き換えます。

于 2015-06-14T07:04:51.470 に答える
0

システムのstarpngファイルのコピーを取得し、photoshop /gimp/その他のエディターを使用して必要なパディングを手動で追加する必要があると思います。

于 2012-06-18T23:29:01.133 に答える
0

私はティムに同意します。私は同じロジックを適用し、それは機能しました。ここで私のプロジェクトでは、スターラティンに自分の星の画像を使用しています。右側に余分なスペース(パディング)があり、星の間にスペースができた星の画像を作成しました。

于 2012-07-04T14:50:05.120 に答える
0

カスタムSVGを使用して、分離値を設定できます

このクラスを使用することで、AndroidカスタムSVG RatingBarを修正し、クラス内の値(この値をThere_You_Can_Set_Your_Valueとしてマーク)を置き換えることでDrawableEndを設定できます。

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Shader
import android.graphics.drawable.*
import android.graphics.drawable.shapes.RoundRectShape
import android.graphics.drawable.shapes.Shape
import android.util.AttributeSet
import android.view.Gravity
import androidx.appcompat.graphics.drawable.DrawableWrapper
import androidx.appcompat.widget.AppCompatRatingBar

class RatingBarSvg @JvmOverloads
constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = R.attr.ratingBarStyle,
) : AppCompatRatingBar(context, attrs, defStyleAttr) {

    private var mSampleTile: Bitmap? = null

    private val drawableShape: Shape
        get() {
            val roundedCorners = floatArrayOf(5f, 5f, 5f, 5f, 5f, 5f, 5f, 5f)
            return RoundRectShape(roundedCorners, null, null)
        }

    init {
        val drawable = tileify(progressDrawable, false) as LayerDrawable
        //drawable.findDrawableByLayerId(android.R.id.background).setColorFilter(backgroundTintColor, PorterDuff.Mode.SRC_ATOP);
        //drawable.findDrawableByLayerId(android.R.id.progress).setColorFilter(progressTintColor, PorterDuff.Mode.SRC_ATOP);
        progressDrawable = drawable
    }

    /**
     * Converts a drawable to a tiled version of itself. It will recursively
     * traverse layer and state list drawables.
     */
    @SuppressLint("RestrictedApi")
    private fun tileify(drawable: Drawable, clip: Boolean): Drawable {
        if (drawable is DrawableWrapper) {
            var inner: Drawable? = drawable.wrappedDrawable
            if (inner != null) {
                inner = tileify(inner, clip)
                drawable.wrappedDrawable = inner
            }
        } else if (drawable is LayerDrawable) {
            val numberOfLayers = drawable.numberOfLayers
            val outDrawables = arrayOfNulls<Drawable>(numberOfLayers)

            for (i in 0 until numberOfLayers) {
                val id = drawable.getId(i)
                outDrawables[i] = tileify(
                    drawable.getDrawable(i),
                    id == android.R.id.progress || id == android.R.id.secondaryProgress
                )
            }

            val newBg = LayerDrawable(outDrawables)

            for (i in 0 until numberOfLayers) {
                newBg.setId(i, drawable.getId(i))
            }

            return newBg

        } else if (drawable is BitmapDrawable) {
            val tileBitmap = drawable.bitmap
            if (mSampleTile == null) {
                mSampleTile = tileBitmap
            }

            val shapeDrawable = ShapeDrawable(drawableShape)
            val bitmapShader = BitmapShader(
                tileBitmap,
                Shader.TileMode.REPEAT, Shader.TileMode.CLAMP
            )
            shapeDrawable.paint.shader = bitmapShader
            shapeDrawable.paint.colorFilter = drawable.paint.colorFilter
            return if (clip)
                ClipDrawable(
                    shapeDrawable, Gravity.START,
                    ClipDrawable.HORIZONTAL
                )
            else
                shapeDrawable
        } else {
            return tileify(getBitmapDrawableFromVectorDrawable(drawable), clip)
        }

        return drawable
    }

    private fun getBitmapDrawableFromVectorDrawable(drawable: Drawable): BitmapDrawable {
        val bitmap = Bitmap.createBitmap(
            drawable.intrinsicWidth + (**There_You_Can_Set_Your_Value**).toInt(), //dp between svg images  //* resources.displayMetrics.density
            drawable.intrinsicHeight,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(bitmap)
        drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
        drawable.draw(canvas)
        return BitmapDrawable(resources, bitmap)
    }

    @Synchronized
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        if (mSampleTile != null) {
            val width = mSampleTile!!.width * numStars
            setMeasuredDimension(
                resolveSizeAndState(width, widthMeasureSpec, 0),
                measuredHeight
            )
        }
    }
}
于 2021-09-20T21:04:55.973 に答える