使用Kotlin的Android SeekBar
在本教程中,我们将使用Kotlin在Android应用程序中讨论和实现SeekBar。
什么是Android SeekBar?
SeekBar是一个UI元素,它是ProgressBar的扩展。
SeekBar将可拖动的拇指添加到ProgressBar。
它通常在音乐应用中用于提供音量控制。
SeekBar就像一个具有上限和下限的标尺,每个步骤都是一个单位。
SeekBar XML属性
SeekBar的一些重要XML属性是:
android:minWidth/maxWidth/minHeight/maxHeight:这些属性用于设置搜索列视图的尺寸。
它们不会改变SeekBar的厚度。android:max/min:SeekBar的上限/下限。
android:min可从Android SDK 26及更高版本获得。android:progress:拇指位置的当前值。
android:progressTint:其中我们将进度的颜色传递到拇指位置的左侧。
android:progressBackgroundTint:此颜色显示在拇指右边的SeekBar背景中。
android:thumb:在这里我们可以传递一个自定义的drawable,它将作为搜索列的拇指。
android:thumbTint:拇指的颜色。
android:thumbOffset:拇指与dp中当前进度之间的距离。
负值会将拇指移到进度的右侧。
正数将其向左移动。" style":用于在SeekBar上设置自定义/预定义的样式。
有一种流行的搜索列样式-"离散"(Discrete)-将进度分为离散间隔。android:tickMark:在这里我们传递一个drawable,它作为SeekBar上的断点。
断点/刻度标记的数量等于android:max。android:tickMarkTint:用于在tickMark可绘制对象上设置颜色。
android:splitTrack:这需要一个布尔值。
默认情况下,Android Lollipop或者更高版本上是这样。
它将Seekbar轨道分为两部分– SeekBar的左侧和右侧。
在白色背景活动中并非总是可见。
在Kotlin中创建SeekBar
我们可以实现SeekBar.OnSeekBarChangeListener接口来以编程方式创建SeekBar。
我们必须实现以下三个Kotlin函数。
fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) fun onStartTrackingTouch(p0: SeekBar?) fun onStopTrackingTouch(p0: SeekBar?)
SeekBar示例
通过设置以上属性,让我们看一下SeekBar的不同类型。
1.简单的SeekBar
<SeekBar
android:id="@+id/seekbar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
2.具有进度色颜色的SeekBar
<SeekBar
android:id="@+id/seekbar2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="50"
android:minWidth="100dp"
android:padding="8dp"
android:progress="10"
android:progressBackgroundTint="@android:color/black"
android:progressTint="@color/colorPrimaryDark"
3.带有拇指色和偏移量的SeekBar
<SeekBar
android:id="@+id/seekbar3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:progressBackgroundTint="@android:color/holo_green_light"
android:progressTint="@android:color/black"
android:thumbOffset="-20dp"
android:thumbTint="@color/colorPrimary"
4.带有TickMarks的SeekBar
<SeekBar
android:id="@+id/seekbar4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="4"
android:padding="8dp"
android:progress="1"
android:progressTint="@android:color/holo_green_light"
android:thumbTint="@color/colorPrimary"
android:tickMark="@drawable/tickmark"
android:tickMarkTint="@color/colorAccent"
下面给出了tickmark.xml可绘制对象。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="-6dp"
android:left="-3dp"
android:top="-6dp">
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimary"
<stroke
android:width="2dp"
android:color="#1fc78c"
</shape>
</item>
</layer-list>
5.具有自定义样式的SeekBar
其中我们以不同的间隔(最大值)设置"离散"样式。
<SeekBar
android:id="@+id/seekbar5"
style="@android:style/Widget.Material.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
<SeekBar
android:id="@+id/seekbar6"
style="@android:style/Widget.Material.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="10"
android:padding="8dp"
6.带有分割轨道的SeekBar
默认情况下,第一个启用拆分轨道。
第二个没有。
<SeekBar
android:id="@+id/seekbar7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:thumbTint="@color/colorPrimary"
android:tickMark="@android:drawable/checkbox_on_background"
android:tickMarkTint="@android:color/black"
<SeekBar
android:id="@+id/seekbar8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:splitTrack="false"
android:thumbTint="@color/colorPrimary"
android:tickMark="@android:drawable/checkbox_on_background"
android:tickMarkTint="@android:color/black"
Android SeekBar 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:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
android:id="@+id/linearLayout"
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"
<SeekBar
android:id="@+id/seekbar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
<SeekBar
android:id="@+id/seekbar2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="50"
android:minWidth="100dp"
android:padding="8dp"
android:progress="10"
android:progressBackgroundTint="@android:color/black"
android:progressTint="@color/colorPrimaryDark"
<SeekBar
android:id="@+id/seekbar3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:progressBackgroundTint="@android:color/holo_green_light"
android:progressTint="@android:color/black"
android:thumbOffset="-20dp"
android:thumbTint="@color/colorPrimary"
<SeekBar
android:id="@+id/seekbar4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="4"
android:padding="8dp"
android:progress="1"
android:progressTint="@android:color/holo_green_light"
android:thumbTint="@color/colorPrimary"
android:tickMark="@drawable/tickmark"
android:tickMarkTint="@color/colorAccent"
<SeekBar
android:id="@+id/seekbar5"
style="@android:style/Widget.Material.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
<SeekBar
android:id="@+id/seekbar6"
style="@android:style/Widget.Material.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="10"
android:padding="8dp"
<SeekBar
android:id="@+id/seekbar7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:thumbTint="@color/colorPrimary"
android:tickMark="@android:drawable/checkbox_on_background"
android:tickMarkTint="@android:color/black"
<SeekBar
android:id="@+id/seekbar8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="50"
android:padding="8dp"
android:progress="10"
android:splitTrack="false"
android:thumbTint="@color/colorPrimary"
android:tickMark="@android:drawable/checkbox_on_background"
android:tickMarkTint="@android:color/black"
<SeekBar
android:id="@+id/seekbar9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:splitTrack="false"
android:thumb="@mipmap/ic_launcher"
</LinearLayout>
我们在最后一个SeekBar中创建了一个自定义缩略图。
custom_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<size
android:width="10dp"
android:height="10dp"
<solid android:color="@android:color/transparent"
</shape>
</item>
<item android:drawable="@mipmap/ic_launcher"
</layer-list>
2.活动科特林代码
MainActivity.kt类的Kotlin代码如下。
package net.androidly.androidlyseekbar
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.SeekBar
import kotlinx.android.synthetic.main.activity_main.*
import android.graphics.PorterDuff
import android.support.v4.content.ContextCompat
class MainActivity : AppCompatActivity(), SeekBar.OnSeekBarChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val seekbar = SeekBar(this)
val layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
layoutParams.setMargins(30, 30, 30, 30)
seekbar.layoutParams = layoutParams
seekbar.progressDrawable.setColorFilter(ContextCompat.getColor(this, R.color.switch_thumb_normal_material_dark), PorterDuff.Mode.SRC_ATOP)
seekbar.setBackgroundColor(ContextCompat.getColor(this,android.R.color.darker_gray))
seekbar.setOnSeekBarChangeListener(this)
linearLayout.addView(seekbar)
seekbar1.setOnSeekBarChangeListener(this)
seekbar2.setOnSeekBarChangeListener(this)
seekbar3.setOnSeekBarChangeListener(this)
seekbar4.setOnSeekBarChangeListener(this)
seekbar5.setOnSeekBarChangeListener(this)
seekbar6.setOnSeekBarChangeListener(this)
seekbar7.setOnSeekBarChangeListener(this)
seekbar8.setOnSeekBarChangeListener(this)
seekbar9.setOnSeekBarChangeListener(this)
}
override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
textView.text = "$p1"
}
override fun onStartTrackingTouch(p0: SeekBar?) {
}
override fun onStopTrackingTouch(p0: SeekBar?) {
}
}
在上面的代码中,我们在Kotlin中创建了SeekBar,并将其添加到LinearLayout中。
我们在每个监听器上都设置了SeekBar更改监听器。
" p1"表示当前进度值,与" seekBar.getProgress()"相同。
我们在TextView中设置此值。

