使用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中设置此值。