1. 程式人生 > >Android進階——巧借自定義VideoView實現Activity的動態視訊背景

Android進階——巧借自定義VideoView實現Activity的動態視訊背景

引言

話說這個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);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //重新計算高度
        int width = getDefaultSize(0, widthMeasureSpec);
        int height = getDefaultSize(0, heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    /**
     * @param pPreparedListener 設定一個在媒體檔案載入並準備就緒時呼叫的回撥。
     */
    @Override
    public void setOnPreparedListener(MediaPlayer.OnPreparedListener pPreparedListener) {
        super.setOnPreparedListener(pPreparedListener);
    }

    /**
     * @param pCompletionListener 設定一個在媒體檔案播放完畢,到達終點時呼叫的回撥。
     */
    @Override
    public void setOnCompletionListener(MediaPlayer.OnCompletionListener pCompletionListener) {
        super.setOnCompletionListener(pCompletionListener);
    }

    @Override
    public 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.CustomVideoView
        android:id="@+id/videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher_round"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="60sp"
            android:textColor="#f00"
            android:text="視訊背景上的TextView"/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="60sp"
            android:textColor="#00f000"
            android:hint="視訊背景上的EditText"/>
        <Button
            android: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;

    @Override
    protected 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);
    }

    @Override
    protected void onRestart() {
        //返回時重新載入視訊,防止退出或返回時視訊黑屏
        initView();
        super.onRestart();
    }

    @Override
    protected void onPause() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mVideoView.stopNestedScroll();
        }
        super.onPause();
    }

    //防止鎖屏或者切出的時候,音樂在播放
    @Override
    protected void onStop() {
        if(mVideoView !=null) {
            mVideoView.stopPlayback();
        }
        super.onStop();
    }

    private void initView() {
        mVideoView =  findViewById(R.id.videoview);
        //設定將要播放視訊檔案的載入路徑僅支援 3gp、MP4、avi
        mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.bg));//此處播放/res/raw下,也可以播放其他路徑的呼叫對應的方法設定即可
        mVideoView.requestFocus();
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public 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() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mVideoView.start();
            }
        });
    }

    public void test(View view) {
        Toast.makeText(this,"在背景視訊上點選按鈕",Toast.LENGTH_SHORT).show();
    }
}

在這裡插入圖片描述

原始碼傳送門碼雲傳送門

相關推薦

Android——定義VideoView實現Activity動態視訊背景

引言 話說這個Activity 動態背景我第一次是在一個菠菜App上看到的,當時感覺逼格很高,最近正好用到專案中,而且好像好久沒有寫關於UI這些“有趣”的文章啦,這篇文章就簡單小結下,其實實現動態背景這並不是唯一的方案,還有其他的方式。 一、VideoView

AndroidAIDL使用定義型別

原文首發於微信公眾號:jzman-blog,歡迎關注交流! 上篇文章中主要介紹從 AIDL 的使用方式以及 Android 開發中不同程序之間的通訊,遺留的問題是如何在 AIDL 中使用自定義型別,具體步驟如下: 1. 建立自定義型別 2. 宣告自定義型別 3.

Android之AlertDialog定義

AlertDialog的自定義方式有很多種,這裡介紹兩種。第一種是比較簡單的,只自定義內容。一、簡單的AlertDialog(只顯示一段簡單的資訊,比如about us)二、帶按鈕的AlertDialog(顯示提示資訊,讓使用者操作,比如exit時的警告框)三、類似ListV

swift新手30天一 定義上圖片下文字的UIButton的幾種方式

目前很多app首頁功能區都類似工具欄上圖示加下文字的方式來自定義按鈕。當然,我們也可以用兩個控制元件實現,但是,提升不了我們的逼格。接下來就介紹幾種自定義這種上圖示下文字的按鈕的幾種方式。先上圖。 ![首頁自定義按鈕.png](https://img-blog.

(二)Django之路 定義管理器

在 Test 模型中構造管理器子類, 並同步如下資料庫 from django.db import models class Test(model.Model): test_id =

反射應用篇之定義反射工具類在springmvc中的應用

本篇使用自定義工具類進行批量處理物件 ---將批量源物件的屬性值注入到實際需要的目標類物件(屬性名相同,型別不同)中 專案使用maven構建war工程:  spring+spring MVC+Mybatis 回顧知識點: 事務:--->為什麼在使用AOP時需要使

Go gRPC-TLS認證+定義方法認證(七)

前言 前面篇章的gRPC都是明文傳輸的,容易被篡改資料。本章將介紹如何為gRPC新增安全機制,包括TLS證書認證和Token認證。 TLS證書認證 什麼是TLS TLS(Transport Layer Security,安全傳輸層),TLS是建立在傳輸層TCP協議之上的協議,服務於應用層,它的前身是SSL(S

Android bc信用盤搭建定義behavior 實現上滑 隱藏底部view

退出 Y軸 log rect app sum string dsl oss 布局 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent"

Android 】仿抖音系列之列表播放視訊(三)

在上一篇【Android 進階】仿抖音系列之列表播放視訊(二)中,我們實現列表播放視訊,這一篇我們來對其做些優化。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android 進階】仿抖音

Android 】仿抖音系列之列表播放視訊(二)

上一篇中,我們實現了仿抖音上下翻頁切換視訊的效果,詳見【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一),這一篇,我們來實現抖音列表播放視訊。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二)

移動開發----Android模仿打字機效果的定義View實現

前言   在做splash介面的時候,需要做類似於打字機打字的效果,字一個一個地蹦出來,顯示每一個字都帶有打字的聲音。 效果演示 實現原理:   這個其實不難實現,通過一個定時器不斷呼叫TextView的setText就行了,在setTex

Android——藉助簡單便捷的ActivityLifecycleCallbacks實現全週期監聽Activity

引言 在開發中由於業務的需求,我們需要在Activity對應的生命週期方法中去完成對應的工作,比如說需要在Activity的onResume中註冊某個SDK或者廣播接收器、抑或是嘗試開啟Camera、判斷app 是否在後臺執行除了令人蛋疼的判斷當前runnin

定義VideoView實現視訊畫面的縮放

1_自定義VideoView,增加設定視訊大小方法 public class VideoView extends android.widget.VideoView {    /** Android系統在更加xml佈局找這個類,並且例項化的時候,用該構造方法例項化 @pa

Android——定義View之繼承TextView用DrawableLeft實現自己的CheckableTextView

引言 Android自帶的許多控制元件已經十分強大,甚至很多功能都已經有現成的控制元件去使用了,不過介面效果是肯定會打折扣的,幸好android控制元件自身的擴充套件性十分優秀,很多時候我們只需要簡單繼承下現有控制元件擴充套件些許功能就能得到一個全新的控制元件

【我的Android之旅】定義ContentProvider

引言 我們知道Android有四大元件,ContentProvider是其中之一,顧名思義:內容提供者。什麼是內容提供者呢?一個抽象類,可以暴露應用的資料給其他應用。應用裡的資料通常說的是資料庫,事實上普通的檔案,甚至是記憶體中的物件,也可以作為內容提供者暴露的

【我的Android之旅】定義控制元件之使用ViewPager實現可以預覽的畫廊效果,並且定義畫面切換的動畫效果的切換時間

我們來看下效果 在這裡,我們實現的是,一個ViewPager來顯示圖片列表。這裡一個頁面,ViewPage展示了前後的預覽,我們讓預覽頁進行Y軸的壓縮,並設定透明度為0.5f,所有我們看到gif最後,左右兩邊的圖片有點朦朧感。讓預覽頁和主頁面有主從感。我們用分

我的Android之旅------>Android定義View來實現解析lrc歌詞並同步滾動、上下拖動、縮放歌詞的功能

前言 最近有個專案有關於播放音樂時候,關於歌詞有以下幾個功能: 1、實現歌詞同步滾動的功能,即歌曲播放到哪句歌詞,就高亮地顯示出正在播放的這個歌詞; 2、實現上下拖動歌詞時候,可以拖動播放器的進度。即可以不停地上下拖動歌詞,

android4step1:Android動畫處理與定義View——SurfaceView

SurfaceView簡介 1、SurfaceView與View的區別 2、SurfaceView的具體使用場景 3、如何使用SurfaceView 一、SurfaceView與View的區別 1、不使用onDraw 2、非UI執行緒繪製 3、獨立

android4step1:Android動畫處理與定義View——定義View

為什麼要自定義控制元件 特定的顯示風格 處理特有的使用者互動 優化我們的佈局 封裝等... 如何自定義控制元件 自定義屬性的宣告與獲取 測量onMeasure 繪製onDraw 狀態的儲存與恢復 步驟一、自定義屬性宣告與獲取

android4step1:Android動畫處理與定義View——轉場動畫

以下都需要執行在5.0以上 一、揭露動畫效果 參考:使用Circular Reveal為你的應用新增揭露動畫效果 最主要的類Circular Reveal 官方將這一動畫稱為揭露效果,它在官網中的描述是這樣的: 當您顯示或隱藏一組 UI 元素時,揭露動畫可為使用者提供視覺