评级栏星星之间的空间

问题描述 投票:0回答:7

我需要在我的评级栏的星星之间插入一个空格,例如评级栏很好:

enter image description here

但我需要它:

enter image description here

我怎样才能做到这一点?

android rating
7个回答
5
投票

我不知道它是否还有用,但我制作了一个自定义库,它允许您以编程方式和 XML(以及其他内容)中更改星号之间的空格:SimpleRatingBar

它的特点:

  • 完全工作
    android:layout_width
    :可以设置为
    wrap_content
    match_parent
    或任意dp。
  • 任意数量的星星。
  • 任意步长。
  • 可以精确控制星星的大小或通过设置最大大小来控制。
  • 正常状态下可自定义颜色(星星和评级栏的边框、填充和背景)。
  • 按下状态下可自定义颜色(边框、填充和星星背景以及评级栏)。
  • 可定制星星之间的尺寸间隔。
  • 可定制星星边框宽度。
  • 可定制的星星角半径。
  • 允许设置 OnRatingBarChangeListener
  • 星星填充可以设置为从左到右或从右到左开始(RTL语言支持)。
  • AnimationBuilder 集成在视图中,可通过动画以编程方式设置评级。

这是它的预览

就您而言,您只需要做:

ratingbar.setStarsSeparation(20, Dimension.DP);

或者,例如,以像素为单位:

ratingbar.setStarsSeparation(100, Dimension.PX);

您可以在

jcenter
Maven Central
中找到它。因此,在您的
build.gradle
文件中只需添加到您的依赖项:

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


4
投票

您还有下一个房产。

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

@drawable/ rating_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 并根据需要添加间距。


1
投票

只需使用自定义图标并使用样式,我的意思是按照您希望的样子对其进行 Photoshop 并替换为系统评级样式图标。


0
投票

我认为你必须获取系统星 png 文件的副本,并使用 Photoshop / gimp / 一些其他编辑器手动添加你想要的填充。


0
投票

我同意蒂姆 我应用了相同的逻辑并且它起作用了。 在我的项目中,我使用自己的星星图像作为星星等级 我制作的星星图像在右侧有额外的空间(填充),从而导致星星之间存在空间


0
投票

您可以使用自定义 SVG 并设置您的分隔值

通过使用这个类,您可以修复Android自定义SVG RatingBar并通过替换类内的值(我将此值标记为There_You_Can_Set_Your_Value)来设置Drawable End。

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
            )
        }
    }
}

0
投票

对于那些遵循上面prsnlme答案的人,请使用

这个答案
中的SvgRatingBar并编辑
getBitmapDrawableFromVectorDrawable()
函数,如下所示,为
SvgRatingBar

添加水平填充
 private fun getBitmapDrawableFromVectorDrawable(drawable: Drawable): BitmapDrawable {


    val padding : Int = (**Here_You_Can_Set_Your_Value**)


    val bitmap = Bitmap.createBitmap(
        drawable.intrinsicWidth + padding / 2 + padding,
        drawable.intrinsicHeight,
        Bitmap.Config.ARGB_8888
    )
    val canvas = Canvas(bitmap)
    canvas.drawColor(Color.BLUE);
    canvas.drawBitmap(bitmap, padding.toFloat() * 2, 0F, null)
    drawable.setBounds(
        padding / 2,
        0,
        drawable.intrinsicWidth + padding,
        drawable.intrinsicHeight
    )
    drawable.draw(canvas)
    return BitmapDrawable(resources, bitmap)
}
© www.soinside.com 2019 - 2024. All rights reserved.