1. 程式人生 > >VideoView可雙指縮放大小的視訊播放研究

VideoView可雙指縮放大小的視訊播放研究

實際上,VideoView播放和可縮放之間沒有任何必然聯絡。奈何由著我性子來(實際上是突然發現了可以這樣試試)。依舊沒有GIF圖。依舊僅僅作為技術積累研究。

功能點: 橫豎屏切換記錄播放進度 跳轉頁面返回,或者切換後臺再進來記錄播放順訊。 雙指自由縮放視訊播放大小。

原始大小:

這裡寫圖片描述

縮放大小:

這裡寫圖片描述

下面貼程式碼:

MainActivity.java

package com.example.qxb_810.videoplaydemo;

import android.Manifest;
import android.content.pm.PackageManager;
import
android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.MediaController; import
android.widget.VideoView; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { @BindView(R.id.vv_video) VideoView vvVideo; private int mCurrPostion = 0; private double mCurrDistance = 0; private double mlastDistance = 0
; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); requestPermissions(); if (savedInstanceState != null) { // 橫豎屏切換重新建立時獲取播放進度 mCurrPostion = savedInstanceState.getInt("currPostion", 0); } initVideo(); initEvent(); } /** * 動態申請許可權 ---- API23後需要動態申請許可權 */ private void requestPermissions() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 讀寫儲存許可權 和聯網許可權 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, 1); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("currPostion", vvVideo.getCurrentPosition()); super.onSaveInstanceState(outState); } private void initVideo() { // 網際網路路徑 : http://****.*** Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/bluetooth/pfzl.mp4");//將路徑轉換成uri vvVideo.setMediaController(new MediaController(MainActivity.this));//顯示控制進度條 vvVideo.setVideoURI(uri);//為視訊播放器設定視訊路徑 vvVideo.seekTo(mCurrPostion); vvVideo.start(); } private void initEvent() { vvVideo.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: mlastDistance = 0; mCurrDistance = 0; break; case MotionEvent.ACTION_DOWN: // 點選播放或暫停 if (vvVideo.isPlaying()) { mCurrPostion = vvVideo.getCurrentPosition(); vvVideo.pause(); } else { vvVideo.seekTo(mCurrPostion); vvVideo.start(); } } // 實現縮放效果 if (event.getPointerCount() >= 2) { float offsetX = event.getX(0) - event.getX(1); float offsetY = event.getY(0) - event.getY(1); mCurrDistance = Math.sqrt(offsetX * offsetX + offsetY * offsetY); // 說明剛開始還未賦值 if (mlastDistance == 0) { mlastDistance = mCurrDistance; } else { // 改變幅度大於5時 if (Math.abs(mCurrDistance - mlastDistance) > 5) { LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) vvVideo.getLayoutParams(); layoutParams.width = vvVideo.getWidth() + (int) (mCurrDistance - mlastDistance); layoutParams.height = vvVideo.getHeight() + (int) (mCurrDistance - mlastDistance); vvVideo.setLayoutParams(layoutParams); mlastDistance = mCurrDistance; } } } return true; } }); } @Override protected void onStop() { super.onStop(); if (vvVideo.isPlaying()) { mCurrPostion = vvVideo.getCurrentPosition(); vvVideo.pause(); } } @Override protected void onRestart() { super.onRestart(); vvVideo.seekTo(mCurrPostion); vvVideo.start(); } }

對應佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <LinearLayout
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <VideoView
            android:id="@+id/vv_video"
            android:layout_width="500dp"
            android:layout_height="400dp"
            android:layout_gravity="center" />
    </LinearLayout>
</LinearLayout>