Android RatingBar使用Kotlin

时间:2020-02-23 14:29:10  来源:igfitidea点击:

在本教程中,我们将使用Kotlin在Android应用程序中讨论和实现RatingBar。

什么是Android RatingBar?

Android RatingBar是SeekBar的扩展。
SeekBar是ProgressBar的扩展。

评级列用于创建审阅/评级UI,用户可以在该UI上拖动鼠标,除非没有明确的拇指图标。

等级列状态

RatingBar具有三种状态:完全,空和部分状态。

等级列的等级是浮点值。

等级列XML属性

等级列的重要XML属性是:

  • android:numStars-您希望在屏幕上显示的星级评分。
    如果将RatingBar宽度设置为与父项匹配,则该属性将被忽略,并且星数为10。

  • android:rating-这是一个浮点数。
    这里的值充满了那么多星星。

  • android:stepSize-每个星星的大小。
    默认情况下,该值为0.5。
    将其设置为1不能再部分填充星星。
    此属性应介于0和1之间。

  • android:progressTint-填充的星星的颜色。

  • android:progressBackgroundTint-未填充的星星的颜色。

  • android:secondaryProgressTint-此处传递的颜色会在部分填充的星星上添加边框。

  • android:isIndicator-将其设置为true表示RatingBar仅用于显示。
    您无法填写评分。

  • android:progressDrawable-我们在此处传递自定义星星的drawable。

  • style-用于在RatingBar上设置自定义/内置样式。
    除了默认的样式外,还有另外两个:Small,Indicator。
    我们也可以创建自己的自定义样式。

Kotlin代码创建评分列

实现了OnRatingBarChangeListener接口,并且必须重写以下Kotlin函数。

override fun onRatingChanged(p0: RatingBar?, p1: Float, p2: Boolean)

如果用户更改了评分,则布尔值为true。

等级列XML示例

让我们看看使用XML代码的不同类型的RatingBar。

1.简单的评分列

<RatingBar
      android:id="@+id/ratingBar1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:rating="1"
      android:stepSize="1" 

2.带有背景和二次进度色调的评分列

<RatingBar
      android:id="@+id/ratingBar3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@color/colorPrimary"
      android:numStars="3"
      android:secondaryProgressTint="@android:color/white"
      android:stepSize="0.2" 

3.具有进度和二级进度色调的RatingBar

<RatingBar
      android:id="@+id/ratingBar4"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/black"
      android:progressTint="@android:color/holo_green_dark"
      android:rating="1"
      android:stepSize="0.5" 

  <RatingBar
      android:id="@+id/ratingBar5"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/white"
      android:progressTint="@android:color/holo_green_dark"
      android:rating="2.5"
      android:secondaryProgressTint="@color/colorPrimaryDark"
      android:stepSize="0.5" 

默认情况下,辅助进度色是在styles.xml中设置的" colorAccent"。

4.评级列小样式

<RatingBar
      android:id="@+id/ratingBar7"
      style="@android:style/Widget.Material.RatingBar.Small"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="8dp"
      android:isIndicator="false"
      android:numStars="5"
      android:rating="1"
      android:stepSize="0.5" 

5.自定义评分列

Android RatingBar Kotlin项目结构

1. XML布局代码

下面给出了布局activity_main.xml的代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/linearLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_margin="16dp"
  android:gravity="center"
  android:orientation="vertical"
  tools:context=".MainActivity">

  <TextView
      android:id="@+id/textView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="0"
      android:textSize="32sp"

  <RatingBar
      android:id="@+id/ratingBar1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:rating="1"
      android:stepSize="1" 

  <RatingBar
      android:id="@+id/ratingBar2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:numStars="5" 

  <RatingBar
      android:id="@+id/ratingBar3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@color/colorPrimary"
      android:numStars="3"
      android:rating="0.4"
      android:secondaryProgressTint="@android:color/white"
      android:stepSize="0.2" 

  <RatingBar
      android:id="@+id/ratingBar4"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/black"
      android:progressTint="@android:color/holo_green_dark"
      android:rating="1"
      android:stepSize="0.5" 

  <RatingBar
      android:id="@+id/ratingBar5"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/white"
      android:progressTint="@android:color/holo_green_dark"
      android:rating="2.5"
      android:secondaryProgressTint="@color/colorPrimaryDark"
      android:stepSize="0.5" 

  <RatingBar
      android:id="@+id/ratingBar6"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:isIndicator="true"
      android:numStars="5"
      android:rating="0.7"
      android:stepSize="0.7" 

  <RatingBar
      android:id="@+id/ratingBar7"
      style="@android:style/Widget.Material.RatingBar.Small"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="8dp"
      android:isIndicator="false"
      android:numStars="5"
      android:rating="1"
      android:stepSize="0.5" 

  <RatingBar
      android:id="@+id/ratingBar8"
      style="@style/CustomRatingBar"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="8dp"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/holo_orange_dark" 

  <RatingBar
      android:id="@+id/ratingBar9"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="8dp"
      android:numStars="5"
      android:progressBackgroundTint="@android:color/black"
      android:progressDrawable="@drawable/ic_action_happy"
      android:progressTint="@color/colorPrimary"
      android:rating="1" 

</LinearLayout>

自定义RatingBar需要在styles.xml中设置progressDrawable及其其他属性,否则它将无法正常工作。
最后的RatingBar在以上布局中不起作用。

在styles.xml文件中添加以下代码。

<style name="CustomRatingBar" parent="Widget.AppCompat.RatingBar">
      <item name="android:progressDrawable">@drawable/custom_ratingbar</item>
      <item name="colorControlNormal">#f57c00</item>
      <item name="colorControlActivated">#c51162</item>
  </style>

我们还创建了一个custom_ratingbar.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">
      <bitmap
          android:src="@drawable/ic_action_happy"
          android:tint="?attr/colorControlNormal" 
  </item>
  <item android:id="@android:id/secondaryProgress">
      <bitmap
          android:src="@drawable/ic_action_happy"
          android:tint="?attr/colorControlHighlight" 
  </item>
  <item android:id="@android:id/progress">
      <bitmap
          android:src="@drawable/ic_action_happy"
          android:tint="?attr/colorControlActivated" 
  </item>
</layer-list>

注意:在位图android:src上,您无法设置可绘制的矢量图像。

在本教程的结尾,您可以找到带有项目源代码的自定义星星的图像资产。

2. Kotlin活动代码

MainActivity.kt文件的代码如下。

package net.androidly.androidlyratingbar

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.RatingBar
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), RatingBar.OnRatingBarChangeListener {

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

      ratingBar1.onRatingBarChangeListener = this
      ratingBar2.onRatingBarChangeListener = this
      ratingBar3.onRatingBarChangeListener = this
      ratingBar4.onRatingBarChangeListener = this
      ratingBar5.onRatingBarChangeListener = this
      ratingBar6.onRatingBarChangeListener = this
      ratingBar7.onRatingBarChangeListener = this
      ratingBar8.onRatingBarChangeListener = this
      ratingBar9.onRatingBarChangeListener = this

  }

  override fun onRatingChanged(p0: RatingBar?, p1: Float, p2: Boolean) {

      textView.text = "$p1"
  }
}