Android SeekBar控制视频播放进度实现过程讲解

目录
  • 效果图
  • 简介
  • 使用MediaController控制器
  • 使用SeekBar

效果图

简介

使用VideoView控件播放视频时,我们希望能够调节播放的进度,一种方法是使用自带的控制器MediaController进行控制,另一种方法是自己实现一个SeekBar控制。

使用MediaController控制器

在播放视频时使用自带的控制器MediaController进行进度控制。

MediaController mediaController = new MediaController(this);
mVideoView.setMediaController(mediaController);

使用SeekBar

在播放视频时使用自己实现一个SeekBar控制播放进度。

自定义SeekBar背景drawable/bg_rounded.xml,实现圆角半透明效果。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 背景颜色 -->
    <solid android:color="#20ffffff"/>
    <!-- 圆角背景 -->
    <corners
        android:topLeftRadius="12dp"
        android:topRightRadius="12dp"
        android:bottomLeftRadius="12dp"
        android:bottomRightRadius="12dp"/>
</shape>

界面布局文件layout/activity_video.xml,界面中有一个用于视频播放的VideoView控件和控制播放进度的SeekBar控件。 其中SeekBar使用第一步定义好的背景效果,android:background=“@drawable/bg_rounded”

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    android:keepScreenOn="true"
    tools:context=".activitys.VideoActivity">
    <VideoView
        android:id="@+id/video_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="500dp"
        android:layout_height="25dp"
        android:background="@drawable/bg_rounded"
        android:layout_marginBottom="45dp"
        android:progressTint="#7FFFD4"
        android:thumbTint="#7FFFD4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

VideoActivity文件。

public class VideoActivity extends AppCompatActivity implements EdgeSensorView.MapDemo {
    private static final String TAG = "VideoActivity";
    private VideoView mVideoView;
    private SeekBar mSeekBar;
    private float curProgress;
    private float MAX_PROGRESS;
    private boolean isSeekBarProgress = false;
    private Handler handler = new Handler();
	// 播放过程,自动更新seekbar的进度
    private Runnable runnable = new Runnable() {
        public void run() {
            if (mVideoView.isPlaying()) {
                if (!isSeekBarProgress) {
                    int current = mVideoView.getCurrentPosition();
                    mSeekBar.setProgress(current);
                }
            }
            handler.postDelayed(runnable, 100);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        mSeekBar = findViewById(R.id.seekbar);
        mVideoView = findViewById(R.id.video_view);
        mVideoView.setVideoURI(Uri.parse("android.resource://"
                + getApplicationContext().getPackageName() + "/" + R.raw.vid_bigbuckbunny));
//        MediaController mediaController = new MediaController(this);
//        mVideoView.setMediaController(mediaController);
        mVideoView.requestFocus();
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(true);
                MAX_PROGRESS = mVideoView.getDuration();
                mSeekBar.setMax((int) MAX_PROGRESS);
                Log.i(TAG, "onCreate: " + MAX_PROGRESS + "," + curProgress + "," + bitmaps.length);
                // 开始线程,更新进度条的刻度
                handler.postDelayed(runnable, 0);
                mVideoView.start();
            }
        });
        mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                curProgress = 0;
                mSeekBar.setProgress(0);
            }
        });
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                isSeekBarProgress = true;
                if (mVideoView.isPlaying()) {
                    mVideoView.pause();
                }
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int pro = seekBar.getProgress();
                mVideoView.seekTo(pro);
                if (!mVideoView.isPlaying()) {
                    mVideoView.seekTo(pro);
                    mVideoView.start();
                }
                isSeekBarProgress = false;
            }
        });
    }
    @Override
    protected void onResume() {
        super.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(runnable);
    }
    private void updateSeekBarStatus(final boolean b) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mSeekBar.setPressed(b);
            }
        });
    }
}

拓展:

  • 增加控制播放/暂停的按钮;
  • 增加播放视频当前播放时间及总时长的文本显示;

到此这篇关于Android SeekBar控制视频播放进度实现过程讲解的文章就介绍到这了,更多相关Android SeekBar控制视频进度内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android SeekBar实现平滑滚动

    本文实例为大家分享了Android SeekBar实现平滑滚动的具体代码,供大家参考,具体内容如下 由于项目需要,SeekBar只需要三个档,但是如果只设置三个档会很难滑,看着也不好看,于是我将其设置为100,然后自动滑到0,50,100的位置 大部分代码还是跟之前一样,只是把max改为100,progress改为50 <SeekBar android:layout_width="match_parent" android:layout_height="wrap_con

  • Android通过SeekBar调节布局背景颜色

    本文实例为大家分享了Android通过SeekBar调节布局背景颜色的具体代码,供大家参考,具体内容如下 用RGB设置布局背景颜色的方法 relativeLayout.setBackgroundColor(Color.rgb(r,g,b)); 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.andro

  • Android自定义SeekBar实现滑动验证且不可点击

    最近公司因为短信接口被盗刷的比较严重,需要做一个类似于淘宝的滑动验证,用于特定环境,以增加一层保障.拿到需求首先想到的是自定义ViewGroup来实现,里面放一个seekbar和TextView即可.但是有更简单的方法,直接在布局中放入seekbar和TextView,不就ok了?用最简单快捷的方法实现需求,才是硬道理. 值得一提的是,seekbar默认情况下是支持点击事件的,也就是说,用户可以直接点击进度条以实现滑动验证这是不允许的,因此,自定义seekbar,屏蔽点击事件.下面我们先从see

  • Android SeekBar充当Progress实现兔兔进度条Plus

    目录 前言 正篇 实现过程 总结 前言 之前写的progress其实根本没有起到进度条的作用,太显眼,而且并不好看,所以有了新的想法,我们将ProgressBar控件换成SeekBar控件,然后再将它的thumb指示器换成小兔子即可. 正篇 实现过程 首先,我们在需要进度条的页面布局的最开始加上下面代码: <SeekBar android:id="@+id/vSeekBar" android:layout_width="match_parent" androi

  • Android开发自定义双向SeekBar拖动条控件

    目录 目标:双向拖动的自定义View 实现步骤 自定义属性获取 确定自定义view尺寸 绘制相关的内容部分 滑动事件处理 目标:双向拖动的自定义View 国际惯例先预览后实现 我们要实现的就是一个段位样式的拖动条,用来做筛选条件用的,细心的朋友可能会发现微信设置里面有个一个通用字体的设置,拖动然后改变字体大小; 这个相对比微信那个的自定义view算是一个扩展,因为我们是双向滑动,这个多考虑的一点就是手指拖动的是哪一个滑动块! 我们先看下GIF预览,然后我们今天就一步步实现这个小玩意… 实现步骤

  • Android开发双向滑动选择器范围SeekBar实现

    目录 一.概述 二.实现 2.1 首先看我们自定义View的全部代码 2.2 实现流程 初始化 计算宽高 onDraw 绘制进度条 事件监听 三.使用 布局文件 布局文件(有刻度线) 布局文件(无刻度线) 四.后记 一.概述 之前公司app里面有个功能是一个可以双向滑动的范围选择器,我在网上百度过一些实现方法,感觉各有利弊吧,但是都不太适合我们的需求.所以站在巨人的肩膀上,通过自定义View实现了一个可以适用于绝大多数情况的范围选择器来供大家使用. 首先,看效果图: 我对该范围选择器的属性进行了

  • Android开发手册SeekBar拖动条使用实例

    目录 实践过程 常用属性 基本使用 自定义样式 自定义样式 实践过程 常用属性 因为Seekbar继承自ProgressBar,所以ProgressBar支持的XML属性SeekBar都适用. [android:max="100"]:设置该进度条的最大值[android:progress="50"]:设置该进度条的已完成进度值[android:progressDrawable="@drawable/icon_xinsui"]:自定义drawabl

  • Android自定义SeekBar实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在SeekBar右边有一个文本框显示当前播放时间/总时间. step1.先来看一看PopupWindow的布局文件,seek_popu.xml,效果如下图所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLa

  • Android seekbar(自定义)控制音量同步更新

    Android seekbar控制音量同步更新 作为开发人员来讲,seekbar你一定会碰到,那么怎么自定义seekbar以及seekbar控制的音量怎么与系统的seekbar音量同步更新.今天就下拉菜单中添加SeekBar控制音量为例(Android 5.1系统)   一:自定义Seekbar 先来看一下所自定义的效果图: 首先来来看一下布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

  • Android seekbar实现可拖动进度条

    本文实例为大家分享了Android seekbar实现可拖动进度条的具体代码,供大家参考,具体内容如下 SeekBar通过滑块的位置来标识数值 允许用户通过拖动滑块来改变进度值的大小 控件:SeekBar            两个TextView 显示状态 实现SeekBar.OnSeekBarChangeListener接口 对事件进行监听 xml文件: <?xml version="1.0" encoding="utf-8"?> <Linea

  • Android SeekBar 自定义thumb旋转动画效果

    目录 简介 示例 dimens.xml drawable shape_thumb_round_1.xml layers_thumb_ring_sweep_1.xml rotate_thumb_1.xml layers_seek_bar_progress_1.xml layout Activity中调用 小结 简介 某些音乐播放或者视频播放的界面上,资源还在加载时,进度条的原点(thumb)会显示一个转圈的效果. 资源加载完成后,又切换回静态效果.这个效果增强了用户体验. 一般来说有美术人员负责设

  • Android自定义webView头部进度加载效果

    不多说先来看下效果图: 1. 颜色渐变加载进度条(夜神模拟器) 绿色加载进度条(魅蓝note2) 看图说话: 上图是不是加载网页的时候会有一个进度条在横向加载,比以前网速不好的时候是一片空白给人的感觉友好多了是不,然后效果还不错. 实现思路 就是自己画一条进度线(大家应该都会吧)然后加载到WebView的上面,开始进度条是隐藏的,进度线初始值为1,然后为了效果好一点,初始少于10的进度都让它加载到10的位置,等进度到100的时候0.2秒后隐藏. 请记得添加网络权限: <uses-permissi

  • Android实现音乐视频播放

    本文实例为大家分享了Android实现音乐视频播放的具体代码,供大家参考,具体内容如下 步骤 1.新建一个安卓项目,再加一个assets包 2.在 assets中加入一段音频 3.在界面中加入音乐的"开始"按钮和"暂停"按钮. 4.在 MainActivity文件中写相应逻辑 package com.hnucm.c201901020110; import androidx.annotation.RequiresApi; import androidx.appcomp

  • Android Canva实现渐变进度条

    目录 前言 前言 标题说渐变进度条是为了方便理解,这里本身的项目背景是一款表盘的分针.先上图: 表盘 周圈蓝色的渐变条(分针)就是本次要实现的东西. 1.拆分 首先,熟悉Canvas的朋友应该知道它可以画出各种形状,但偏偏没有一头是圆的环形(这里不考虑使用path绘制).所以我们不得不把它拆分为2个形状:圆环与圆. 2.绘制圆环 绘制圆环有很多种方法,比如画2个圆取补集之类的.这里直接使用canvas.drawArc()函数来画.先看看函数原型: void drawArc (RectF oval

  • Android 常见的四种对话框实例讲解

    1.对话框通知(Dialog Notification) 当你的应用需要显示一个进度条或需要用户对信息进行确认时,可以使用对话框来完成. 下面代码将打开一个如图所示的对话框: public void click1(View view) { AlertDialog.Builder builder = new Builder(this); builder.setTitle("工学1号馆"); builder.setIcon(R.drawable.ic_launcher); builder.

  • Android 实现自定义圆形进度条的功能

    Android 实现自定义圆形进度条:                 Android 自定义view,在大多数项目中根据客户需求及用户的体验度来说,都要重新写控件的来展示漂亮的界面,这里就对圆形进度条说下如何实现. 绘制自定义的圆形进度条,分为三个步骤,内圆.外圆.文字. 其中内圆和文字比较好绘制,进度条的变化是由外圆来控制的,所以核心就是绘制外圆. 首先定义分别定义这三个画笔,两个Paint和一个TextPaint mCirclePaint = new Paint(); mCirclePai

  • Android SeekBar实现滑动条效果

    本文实例为大家分享了Android SeekBar实现滑动条效果的具体代码,供大家参考,具体内容如下 SeekBar是ProgressBar的一个子类,下面我们用一个可以改变并显示当前进度的拖动条例子来演示一下它的使用: 1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/

随机推荐