引言

话说这个Activity 动态背景我第一次是在一个菠菜App上看到的,当时感觉逼格很高,最近正好用到项目中,而且好像好久没有写关于UI这些“有趣”的文章啦,这篇文章就简单小结下,其实实现动态背景这并不是唯一的方案,还有其他的方式。

一、VideoView

1、VideoView概述

VideoView继承自SurfaceView 并实现了MediaController.MediaPlayerControl接口, 是一种可以直接加载并播放来自多种路径(比如 resources 、raw、 content providers)的视频文件资源的官方控件,可以像其他任何普通控件一样在任意布局中声明并使用,有了他使得一些简单播放视频的工作变得简单(但是不适合应用在大型复杂项目等专业的播放音视频的项目中)。需要注意的是VideoView不会自动保存播放状态和播放位置等,所以当进入到后台前,若需要再再次返回时恢复 所选曲目或通过addSubtitleSource()添加的任何字幕轨道等状态, 应在Activity.onSaveInstanceState(Bundle)和Activity.onRestoreInstanceState(Bundle)中自行保存和恢复这些内容。

2、VideoView 重要的成员方法

名称 说明
void addSubtitleSource(InputStream is, MediaFormat format) 添加外部字幕文件流
boolean isPlaying() 判断是否正在播放
int getCurrentPosition() 获取当前播放位置
void seekTo(int msec) 跳转到指定位置
void setOnCompletionListener(MediaPlayer.OnCompletionListener l) 设置一个在媒体文件加载并准备就绪时调用的回调。
void setOnCompletionListener(MediaPlayer.OnCompletionListener l) 设置一个在媒体文件播放完毕,到达终点时调用的回调
void setOnErrorListener(MediaPlayer.OnErrorListener l) 设置一个在媒体文件播放或者设置时发生错误调用的回调
void setVideoPath(String path) 设置播放视频的字符串路径
void setVideoURI(Uri uri, Map<String, String> headers) 使用指定的头部设置播放视频的URi
void setVideoURI(Uri uri) 设置视频的URi
void setMediaController(MediaController controller) 设置视频播放控制器

二、自定义VideoView实现动态视频背景

其实原理很简单就是利用VideoView控件播放指定的一个视频文件,并把之设置为全屏幕的(非必须要求结合自己的需求来定),然后在生命周期方法中利用提供的各种方法进行监听。

1、 继承VedioView 重写onMeasure方法,为了更好的自适应全屏幕

package com.crazymo.activitybganim.widget;import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.VideoView;/*** Auther: Crazy.Mo on 2018/8/24 14:35* Summary:继承VideoView实现自适应全屏幕*/
public class CustomVideoView extends VideoView {public CustomVideoView(Context context) {this(context,null);}public CustomVideoView(Context context, AttributeSet attrs) {this(context, attrs,0);}public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重新计算高度int width = getDefaultSize(0, widthMeasureSpec);int height = getDefaultSize(0, heightMeasureSpec);setMeasuredDimension(width, height);}/*** @param pPreparedListener 设置一个在媒体文件加载并准备就绪时调用的回调。*/@Overridepublic void setOnPreparedListener(MediaPlayer.OnPreparedListener pPreparedListener) {super.setOnPreparedListener(pPreparedListener);}/*** @param pCompletionListener 设置一个在媒体文件播放完毕,到达终点时调用的回调。*/@Overridepublic void setOnCompletionListener(MediaPlayer.OnCompletionListener pCompletionListener) {super.setOnCompletionListener(pCompletionListener);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return super.onKeyDown(keyCode, event);}
}
  • 在布局文件中声明自定义的VedioView
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><com.crazymo.activitybganim.widget.CustomVideoViewandroid:id="@+id/videoview"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher_round"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="60sp"android:textColor="#f00"android:text="视频背景上的TextView"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="60sp"android:textColor="#00f000"android:hint="视频背景上的EditText"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button Click"android:onClick="test"/></LinearLayout></FrameLayout>
  • 在Activity中初始化VideoView并在对应的周期方法中进行对应的监听处理
package com.crazymo.activitybganim;import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;import com.crazymo.activitybganim.widget.CustomVideoView;public class MainActivity extends AppCompatActivity {//创建播放视频的控件对象private CustomVideoView mVideoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setFullScreen();setContentView(R.layout.activity_main);initView();}private void setFullScreen() {requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);}@Overrideprotected void onRestart() {//返回时重新加载视频,防止退出或返回时视频黑屏initView();super.onRestart();}@Overrideprotected void onPause() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {mVideoView.stopNestedScroll();}super.onPause();}//防止锁屏或者切出的时候,音乐在播放@Overrideprotected void onStop() {if(mVideoView !=null) {mVideoView.stopPlayback();}super.onStop();}private void initView() {mVideoView =  findViewById(R.id.videoview);//设置将要播放视频文件的加载路径仅支持 3gp、MP4、avimVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.bg));//此处播放/res/raw下,也可以播放其他路径的调用对应的方法设置即可mVideoView.requestFocus();mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {if (mp.isPlaying()) {mp.stop();mp.release();mp = new MediaPlayer();}mp.setVolume(0f, 0f);//设置0,0为静音时mp.setLooping(true);mp.start();}});mVideoView.setFocusable(false);mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mediaPlayer) {mVideoView.start();}});}public void test(View view) {Toast.makeText(this,"在背景视频上点击按钮",Toast.LENGTH_SHORT).show();}
}

源码传送门和码云传送门

Android进阶——巧借自定义VideoView实现Activity的动态视频背景相关推荐

  1. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  2. android alertdialog_Android进阶:Activity设置主题背景后AlertDialog的背景随之改变的问题分析

    在制作App的闪屏页时如果你仔细观察就会发现,每次你在手机桌面点击图标启动应用时会先出现一个白色背景(也就是我们通常所说的白屏),然后才会跳转到闪屏页. 就像这样: 关于如何解决启动时的白屏问题,大家 ...

  3. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  4. [android] 练习样式主题自定义activity切换动画

    主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" en ...

  5. Android 系统(264)---android进阶——自定义View

    android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性  https://www.jianshu.com/p/48944aad200 ...

  6. android activity传值到dialog,android 自定义AlertDialog 与Activity相互传递数据

    **主要实现功能:** 1.从Activity的TextView中获取字符串设置到AlertDialog的TextView和EditText中 2.将AlertDialog的EditText中的值设置 ...

  7. 【微信小程序控制硬件⑦ 进阶篇】巧借阿里云物联网平台的免费连接,从微信小程序颜色采集控制 esp8266 输出七彩灯效果,中秋节来个直播如何?!

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  8. Android进阶之自定义View实战(二)九宫格手势解锁实现

    一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的 ...

  9. Android进阶:自定义视频播放器开发(上)

    随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:Smal ...

最新文章

  1. R语言data.table导入数据实战:把data.frame数据转化为data.table数据
  2. 输出控制台传递的参数——小小实例。
  3. sping中@import
  4. java的object如何转为具体的类_佛山个体户如何转为公司?
  5. poj 3164(最小树形图)
  6. 朱峰谈概念设计(三):可信的设计
  7. how to create BRF application via code
  8. 电脑操作系统维护10条实用建议!
  9. mysql geocode_百度地图Geocoding API获取特定地区或地址的经纬度信息,然后在MySql数据库多表循环遍历更新...
  10. web开发的一些材料
  11. 从网络营销辞职转行软件测试,100天的心酸拿到9K,过程都是自己在苦撑,只因我...
  12. linux oracle pam,Linux技术之深入Linux PAM 体系结构(一)
  13. 开放IPTV论坛(OIPF)的HBB TV标准规范
  14. Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
  15. 【Java】poi | excel | 合并单元格
  16. ArduPilot — ArduPlane架构概述
  17. Java 优惠券最优使用实现
  18. OneNote快捷键大全
  19. shchangenotifyregister 监视子文件夹文件改变_真假文件夹?FakeFolder病毒再次捣乱企业内网...
  20. 《微机原理第五版》期末知识总结(第八章---第十章)

热门文章

  1. js中几种对数值取整数和小数部分的方法
  2. 分布式三大利器之限流
  3. 使用OpenCV+Tensorflow跟踪排球的轨迹
  4. 《咸鱼分享》咸鱼在线TOP
  5. 机器视觉硬件——工业相机
  6. 学习感悟-如何养成良好的编程习惯
  7. 如何选购笔记本电脑?
  8. NFT Insider #49:YGG学员总量突破20000名,《南华早报》在The Sandbox中构建香港天星码头
  9. c语言海报,C语言 竞选海报
  10. 如何使用计算机做海报,用word做的海报步骤_word怎么设计海报