【问题标题】:Space Between stars of ratingBar评分栏星之间的空间
【发布时间】:2012-06-20 23:45:59
【问题描述】:

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

但我需要它:

我该怎么做?

【问题讨论】:

标签: android rating


【解决方案1】:

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

【讨论】:

  • 根据我上面发布的链接,我相信您可以自定义用于星星的Drawable,使用大小属性来伪造填充(通过为RatingBar 设置style 标签)。
  • 这种方式太丑了,评分栏类的配置中没有办法
  • @Soxxeh 嗯,我在您发布的任何一个链接中都找不到这样的示例。第一个似乎更有希望,但第一句话说:“您必须将填充添加到 png 本身”并继续显示 ProgressBar 类中的一个方法。我在任何地方都看不到影响填充的样式。你能详细说明一下吗?
  • @Tim Argh,我的错,我误读了我发布的第二个链接。 (它改变了实际的图像大小,而不是大小+填充......)我会在上面评论。
【解决方案2】:

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

【讨论】:

  • 是的,我同意,但是。现在考虑以下情况,您将在一个大型项目上制作 4 种类型的 ratingbars,每个带有 2 或 3 种不同类型 drawable 的 ratingbar 大约有 10 张图像,例如 2px 的空间,现在认为有必要增加 1px 的空间,我更喜欢将 setPadding(2) 更改为 setPadding(3) 而不是重新发布超过 10 张图像。
  • 您有解决方案吗?请分享您尝试过的最好的方法
  • 不幸的是,没有什么优雅的方法可以解决这个问题,我在自己的图像中添加了空格 :( ,我不喜欢这个问题,希望有一天能找到合适的方法来解决。
【解决方案3】:

您有下一个属性。

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,并在需要时添加 spassing。

【讨论】:

  • 是的,我同意,但是。现在考虑以下情况,您将在一个大型项目上制作 4 种类型的 ratingbars,每个具有 3 种不同类型 drawable 的 ratingbar 大约有 12 张图像,例如放置 2px 的空间,现在认为有必要增加 1px 的空间,我更喜欢将 setPadding(2) 更改为 setPadding(3) 而不是重新发布超过 10 张图片
  • 通过在可绘制对象的左侧和/或右侧添加插图,我们会在视图的左侧和/或右侧边框上获得不需要的填充。
【解决方案4】:

只需为其使用自定义图标并使用样式,我的意思是 Photoshop 它,因为您希望它看起来并替换为系统评级样式图标。

【讨论】:

    【解决方案5】:

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

    它的特点:

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

    Here is a preview of it.

    在你的情况下,你只需要这样做:

    ratingbar.setStarsSeparation(20, Dimension.DP);
    

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

    ratingbar.setStarsSeparation(100, Dimension.PX);
    

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

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

    【讨论】:

    • 不支持自定义可绘制星星。还是这样?
    • 嗨@FoY,它没有。
    【解决方案6】:

    您可以使用自定义 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
                )
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2022-01-09
      • 2016-09-23
      • 1970-01-01
      相关资源
      最近更新 更多