泰安建設(shè)企業(yè)網(wǎng)站華與華營(yíng)銷策劃公司
SeekBar 在開發(fā)中并不陌生,默認(rèn)的SeekBar是不顯示進(jìn)度的,當(dāng)然用吐司或者文案在旁邊實(shí)時(shí)顯示也是可以的,那能不能移動(dòng)的時(shí)候才顯示,默認(rèn)不顯示呢,當(dāng)然網(wǎng)上花哨的三方工具類太多了,但是我只是單純的想在SeekBar的基礎(chǔ)上去添加一個(gè)可以跟隨移動(dòng)顯示的氣泡而已~
先看一下效果:
這篇文章可能會(huì)滿足你的需求
1.原生SeekBar使用,無需重寫
2.改動(dòng)量少,不會(huì)對(duì)控件有任何影響
3.使用靈活, Utils使用,復(fù)制粘貼即可使用
先說一下原理吧:
1.首先最最基礎(chǔ)的就是怎么樣在不做到對(duì)原有控件產(chǎn)生影響的情況下去顯示呢?
答: PopupWindow,它只需要拿到對(duì)應(yīng)的目標(biāo)控件即可指定顯示位置
2.如何去跟隨移動(dòng)呢?
答:PopupWindow本身不會(huì)動(dòng)態(tài)移動(dòng),只需要在該彈窗里面設(shè)置一個(gè)控件,讓該控件移動(dòng)即可
具體實(shí)現(xiàn)
拿到控件,用PopupWindow顯示在該控件附近,根據(jù)SeekBar的進(jìn)度,動(dòng)態(tài)設(shè)置該彈窗里面子控件的位置
使用
這里是SeekBar移動(dòng)監(jiān)聽,在這里的三個(gè)方法加上對(duì)應(yīng)的方法即可
mDataBind.controlVolumeSeekbar.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener{override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {//滑塊移動(dòng)SeekBarPopUtils.move(progress,seekBar!!)}override fun onStartTrackingTouch(seekBar: SeekBar?) {//滑塊按下SeekBarPopUtils.showPop(seekBar!!)}override fun onStopTrackingTouch(seekBar: SeekBar?) {//滑塊松開SeekBarPopUtils.dismiss()}})
SeekBarPopUtils 代碼
注意,Kotlin寫的,新建文件的時(shí)候要建Kotlin文件
/*** SeekBar移動(dòng)時(shí)彈出對(duì)應(yīng)的氣泡加數(shù)字*/
@SuppressLint("StaticFieldLeak")
object SeekBarPopUtils {private var popWin: PopupWindow? = nullprivate var clPopPar: ConstraintLayout? = nullprivate var tvPopTxt: TextView? = nullfun showPop(seekBar: SeekBar){popWin = PopupWindow()val mPopView = LayoutInflater.from(BaseApplication.getContext()).inflate(R.layout.item_popup_win,null,false)clPopPar = mPopView.findViewById<ConstraintLayout>(R.id.cl_pop_par)tvPopTxt = mPopView.findViewById<TextView>(R.id.tv_pop_txt)popWin?.contentView = mPopViewpopWin?.height = AppHelper.dp2px(30)popWin?.width = seekBar.widthpopWin?.showAsDropDown(seekBar,0,-(AppHelper.dp2px(30) + popWin!!.height))}fun move(progress: Int,seekBar: SeekBar){val tvPopWidth = AppHelper.dp2px(40)val params: ConstraintLayout.LayoutParams = ConstraintLayout.LayoutParams(tvPopWidth, AppHelper.dp2px(30))params.startToStart = clPopPar!!.idparams.marginStart = (seekBar.width - tvPopWidth)/100 * progress + tvPopWidth/3tvPopTxt?.layoutParams = paramstvPopTxt?.text = progress.toString()}fun dismiss(){popWin?.dismiss()popWin = nullclPopPar = nulltvPopTxt = null}}
item_popup_win 代碼
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/cl_pop_par"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="30dp"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><TextViewandroid:id="@+id/tv_pop_txt"android:layout_width="@dimen/dimen_40"android:layout_height="match_parent"android:gravity="center"app:layout_constraintStart_toStartOf="parent"android:background="@drawable/bg_ffffff_12"android:textSize="@dimen/sp_16"android:textColor="@color/black"tools:text = "999"/></androidx.constraintlayout.widget.ConstraintLayout>
AppHelper.dp2px
fun dp2px(dpVal: Int): Int {return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal.toFloat(),BaseApplication.getContext().resources.displayMetrics).toInt()}