Android进阶之SeekBar动态显示进度

这篇具有很好参考价值的文章主要介绍了Android进阶之SeekBar动态显示进度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SeekBar 在开发中并不陌生,默认的SeekBar是不显示进度的,当然用吐司或者文案在旁边实时显示也是可以的,那能不能移动的时候才显示,默认不显示呢,当然网上花哨的三方类太多了,但是我只是单纯的想在SeekBar的基础上去添加一个可以跟随移动显示的气泡而已~

先看一下效果:

Android进阶之SeekBar动态显示进度,Android,android,SeekBar,SeekBar显示进度

这篇文章可能会满足你的需求
1.原生SeekBar使用,无需重写
2.改动量少,不会对控件有任何影响
3.使用灵活, Utils使用,复制粘贴即可使用
4.样式灵活,自己编写样式

先说一下原理吧:
1.首先最最基础的就是怎么样在不做到对原有控件产生影响的情况下去显示呢?
答: PopupWindow,它只需要拿到对应的目标控件即可指定显示位置
2.如何去跟随移动呢?
答:PopupWindow本身不会动态移动,只需要在该弹窗里面设置一个控件,让该控件移动即可

具体实现
拿到控件,用PopupWindow显示在该控件附近,根据SeekBar的进度,动态设置该弹窗里面子控件的位置

使用

这里是SeekBar移动监听,在这里的三个方法加上对应的方法即可

        mDataBind.controlVolumeSeekbar.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                //滑块移动

                SeekBarPopUtils.move(progress,seekBar!!)
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                //滑块按下
                SeekBarPopUtils.showPop(seekBar!!)
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
                //滑块松开
                SeekBarPopUtils.dismiss()
            }
        })

SeekBarPopUtils (Kotlin)

这里的 tvPopTxt 就是上图的小气泡,如果需要其他样式,直接去弹窗布局里面编写即可文章来源地址https://www.toymoban.com/news/detail-638474.html

/**
 * SeekBar移动时弹出对应的气泡加数字*/
@SuppressLint("StaticFieldLeak")
object SeekBarPopUtils {

    private var popWin: PopupWindow? = null
    private var clPopPar: ConstraintLayout? = null
    private var tvPopTxt: TextView? = null

    fun 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 = mPopView
        popWin?.height = AppHelper.dp2px(30)
        popWin?.width = seekBar.width
        popWin?.showAsDropDown(seekBar,0,-(AppHelper.dp2px(30) + popWin!!.height))
    }


    fun move(progress: Int,seekBar: SeekBar){
        if (clPopPar != null){
            val tvPopWidth = AppHelper.dp2px(40)
            val params: ConstraintLayout.LayoutParams = ConstraintLayout.LayoutParams(
                tvPopWidth, AppHelper.dp2px(30)
            )
            params.startToStart = clPopPar!!.id
            params.marginStart = (seekBar.width - tvPopWidth)/100 * progress + tvPopWidth/3
            tvPopTxt?.layoutParams = params

            tvPopTxt?.text = progress.toString()
        }
    }


    fun dismiss(){
        popWin?.dismiss()
        popWin = null
        clPopPar = null
        tvPopTxt = null
    }

}

SeekBarPopUtils (Java)

public class SeekBarPopUtils {

    private static PopupWindow popWin = null;
    private static ConstraintLayout clPopPar = null;
    private static TextView tvPopTxt = null;

    public static void showPop(SeekBar seekBar){
        popWin = new PopupWindow();
        View mPopView = LayoutInflater.from(App.getInstance().getBaseContext()).inflate(R.layout.item_popup_win,null,false);
        clPopPar = mPopView.findViewById(R.id.cl_pop_par);
        tvPopTxt = mPopView.findViewById(R.id.tv_pop_txt);
        popWin.setContentView(mPopView);
        popWin.setHeight(dp2px(30));
        popWin.setWidth(seekBar.getWidth());
        popWin.showAsDropDown(seekBar,0,-(dp2px(30) + popWin.getHeight()));
    }


    public static void move(int progress,SeekBar seekBar){
        if (clPopPar != null){
            int tvPopWidth = dp2px(40);
            ConstraintLayout.LayoutParams params  = new ConstraintLayout.LayoutParams(
                    tvPopWidth, dp2px(30)
            );
            params.startToStart = clPopPar.getId();
            params.setMarginStart((seekBar.getWidth() - tvPopWidth)/100 * progress + tvPopWidth/3);
            tvPopTxt.setLayoutParams(params);

            tvPopTxt.setText(progress + "");
        }
    }

    private static int dp2px(int dpVal){
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                (float) dpVal,
                App.getInstance().getBaseContext().getResources().getDisplayMetrics()
        );
    }

    public static void dismiss(){
        popWin.dismiss();
        popWin = null;
        clPopPar = null;
        tvPopTxt = null;
    }
}

item_popup_win 代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    android: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">

    <TextView
        android:id="@+id/tv_pop_txt"
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:gravity="center"
        app:layout_constraintStart_toStartOf="parent"
        android:background="@drawable/bg_ffffff_12"
        android:textSize="16sp"
        android:textColor="#000000"
        tools:text = "999"/>

</androidx.constraintlayout.widget.ConstraintLayout>

bg_ffffff_12

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="ResourceName">
    <solid android:color="#FFFFFF" />
    <corners android:radius="12dp" />
</shape>

AppHelper.dp2px

    fun dp2px(dpVal: Int): Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            dpVal.toFloat(),
            BaseApplication.getContext().resources.displayMetrics
        ).toInt()
    }

到了这里,关于Android进阶之SeekBar动态显示进度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 基础知识4-3.8 SeekBar(拖动条)详解

    一、简介          拖动条类似进度条,不同的是用户可以控制,比如,应用程序中用户可以对音效进行控制,这就可以使用拖动条来实现。由于拖动条可以被用户控制,所以需要对其进行事件监听,这就需要实现SeekBar.onSeekBarChangeListener接口。在SeekBar中共需要监听3个事件,

    2024年02月08日
    浏览(51)
  • 安卓进度条:ProgressBar和Seekbar

       ProgressBar 是 Android 中的一个进度条控件,用于显示正在进行的任务的进度。它可以以水平或圆形的形式展示进度,并提供了多种样式和属性来满足不同的需求。 android:progress :设置进度条的当前进度值。 android:max :设置进度条的最大值。 android:indeterminate :设置进度条是

    2024年02月09日
    浏览(28)
  • 一起Talk Android吧(第五百四十八回:如何创建垂直版SeekBar)

    各位看官们大家好,上一回中咱们说的例子是\\\"蓝牙广播中的厂商数据\\\",本章回中介绍的例子是\\\" 如何创建垂直版SeekBar \\\"。闲话休提,言归正转,让我们一起Talk Android吧! 看官们,我们在这里说的 SeekBar 就是滑动条,如果有看官忘记的话,可以查看之前的博客。 SeekBar 在默认情

    2024年02月11日
    浏览(40)
  • Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)

    前一篇文章Android 进阶——图形显示系统之底层图像显示原理小结(一)介绍了关于Android 图形显示系统的基础理论,相信你对于Android的图形显示系统中图形界面渲染刷新机制有了更深的了解,接下来进一步讲解VSync和Choreography的联系和作用。 VSync 可以提升Android 图形显示效果

    2024年02月10日
    浏览(32)
  • Android 实现环形进度条

    一、项目需求 项目中常常需要用到进度条,很简单,这儿做一个简单的总结和实现 二、实现控件 ProgressBar 三、实现代码 1、水平的进度条 xml布局代码: style属性:确定他是什么类型的进度条 progressDrawable属性:确定进度条的背景,进度条颜色等等 mmmmmm.xml:drawable文件代码

    2024年02月01日
    浏览(71)
  • [Android]ProgressBar进度条

    ProgressBar ProgressBar是进度条控件,ProgressBar的应用场景很多,比如用户登录时,后台发送请求,以及进行等待服务器返回信息等一些比较耗时的操作。这个时候如果没有提示,用户可能会以为程序崩溃了或手机死机了,会大大降低用户体验,所有在需要进行耗时操作的地方,添

    2024年02月15日
    浏览(30)
  • Android 之 ProgressBar (进度条)

    本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如 用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用到进度条;或者当在进行一些比较 耗时的操作,需要等待一段较长的时间,这个时候如果没有提示,用户可能会

    2024年02月14日
    浏览(33)
  • uniGUI学习之UniHTMLFrame1例子1进度条显示2模糊圆点粒子背景动画特效3动态进度条(58)

    01]静态进度条 02]模糊圆点粒子背景动画特效 03]动态进度条 01]静态进度条 效果图:   // 这里设置默认初始步骤 StepContentFn(\\\'.starBox\\\', \\\"已申请:杨博:2020/2/3:已申请审批意见, 已立项:杨博:2020/5/5:已立项审批意见, 实施中:张三:2020/5/9:实施中意见 , 等待中 :杨博:2020/6/6:等待中审批意见

    2024年01月20日
    浏览(45)
  • Android studio实现圆形进度条

    参考博客 效果图 MainActivity CircleProgressBar activity_main.xml value/attrs.xml

    2024年02月10日
    浏览(25)
  • android实现简单进度条ProgressBar

    记录一下今天学习的进度条ProgressBar 1、在布局文件中添加ProgressBar 其中 **style=“@android:style/Widget.ProgressBar.Horizontal”**设置进度条样式为水平进度条,否则默认原型旋转的进度条; max 设置进度条长度,这里设置为100。 2、java代码: 声明ProgressBar;int型的mprogress表示进度条进度

    2023年04月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包