使用VideoView做个实用的视频播放器

简介: 目录最终效果图前言布局文件VideoView的使用横竖屏切换文件选择手势调节音量最后最终效果图最终效果图前言这里用VideoView写一个播放器, 可以横竖屏, 可以选文件, 可以暂停, 可以快进后退, 可以进度条拖动, 可以触屏调节音量.

目录

  • 最终效果图
  • 前言
  • 布局文件
  • VideoView的使用
  • 横竖屏切换
  • 文件选择
  • 手势调节音量
  • 最后

最终效果图

最终效果图

前言

这里用VideoView写一个播放器, 可以横竖屏, 可以选文件, 可以暂停, 可以快进后退, 可以进度条拖动, 可以触屏调节音量. 来看看怎么实现的吧!


布局文件

RelativeLayout包裹VideoView是要点, 常规设置会形变的. 当然了, 还要重写onConfigurationChanged, 见后面横竖屏切换.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.so.mymedia.ui.activity.MainActivity"
    tools:showIn="@layout/activity_main">

    <RelativeLayout
        android:id="@+id/rl_vv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:minHeight="200dp">

        <VideoView
            android:id="@+id/vv_video"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" />
    </RelativeLayout>
</RelativeLayout>

VideoView的使用

VideoView使用起来非常简单, 设置好MediaController, 然后设置URI或者是Path, 然后start开始就好. 这里的要点是一些使用功能的实现. 可以查阅官方文档.

官方文档

横竖屏切换

第一步是到配置文件里面设置. 在activity标签下添加android:configChanges="keyboard|orientation|screenSize". 这样的话, 屏幕切换的时候不会去调用onStop等方法. 我们在Toolbar里面添加切换横竖屏按钮, 然后重写onConfigurationChanged.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (mVvVideo == null) {
        return;
    }
    if (this.getResources().getConfiguration().orientation
            == Configuration.ORIENTATION_LANDSCAPE) {
        // 横屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().getDecorView().invalidate();
        float height = new ScreenUtil(this).getAppWidth();
        float width = new ScreenUtil(this).getAppHeight();
        mRlVv.getLayoutParams().height = (int) width;
        mRlVv.getLayoutParams().width = (int) height;
    } else {
        // 竖屏
        final WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setAttributes(attrs);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        float width = new ScreenUtil(this).getAppWidth();
        float height = DisplayUtil.dp2px(this, 200.f);
        mRlVv.getLayoutParams().height = (int) height;
        mRlVv.getLayoutParams().width = (int) width;
    }
}

里面有几个uitl, 都是常见的封装, 不多说了. 这样就可以实现横竖屏切换了.


文件选择

关于文件选择器, 请查看我之前的文章. 然后就是要返回选中的文件路径. 这是Intent的常规使用了. 不多说了.


手势调节音量

添加触摸监听, 然后用手势操作实现. 然后是依据上下划方向确定增大还是减小音量. 调节音量的代码也是很常规的了.

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    float v = e2.getY() - e1.getY();
    if (Math.abs(v) > 10) {
        setVoiceVolume(v);
    }
    return true;
}
private void setVoiceVolume(float value) {
    int currentVolume = mAM.getStreamVolume(AudioManager.STREAM_MUSIC);
    int maxVolume = mAM.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    int flag = value > 0 ? -1 : 1;
    currentVolume += flag * 0.15 * maxVolume;
    mAM.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);
}

最后

如果想更多的DIY, 可以考虑使用SurfaceView, 但是VideoView大部分时候也够用了. 喜欢记得点赞或者关注我, 有意见或者建议评论区见.


目录
相关文章
|
人工智能 编解码 数据可视化
AI Earth ——开发者模式案例1:按区域进行Sentinel2L2A检索与下载
AI Earth ——开发者模式案例1:按区域进行Sentinel2L2A检索与下载
300 0
|
缓存 安全 Java
ByteArray转byte[]的两种方式以及HeapByteBuffer&DirectByteBuffer
将ByteArray转byte[],大部分人第一时间会使用get函数
843 0
|
7月前
|
边缘计算 人工智能 自动驾驶
云计算的加速引擎——5G技术如何改变未来
云计算的加速引擎——5G技术如何改变未来
217 7
云计算的加速引擎——5G技术如何改变未来
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
358 0
|
编解码 移动开发 安全
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
自互联网普及以来,流媒体技术特别是视频直播技术不断进步,出现了多种传输协议。早期的MMS由微软主导,但随WMV格式衰落而减少使用。RTSP由网景和RealNetworks联合提出,支持多种格式,但在某些现代应用中不再受支持。RTMP由Adobe开发,曾广泛用于网络直播,但因HTML5不支持Flash而受影响。HLS由苹果开发,基于HTTP,适用于点播。SRT和RIST均为较新协议,强调安全与可靠性,尤其SRT在电视直播中应用增多。尽管RTMP仍占一定市场,但SRT等新协议正逐渐兴起。
411 8
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
|
XML 编解码 算法
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
564 0
|
IDE 开发工具 虚拟化
EFI VMware Virtual SCSI Hard Drive (0.0) ... No Media
EFI VMware Virtual SCSI Hard Drive (0.0) ... No Media
|
JavaScript 前端开发
常见XSS绕过技巧
常见XSS绕过技巧
1236 0
|
编解码 API 开发工具
FFmpeg获取音视频流信息
FFmpeg获取音视频流信息
388 1
FFmpeg获取音视频流信息
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
490 3