最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android surfaceView實現(xiàn)播放視頻功能

 更新時間:2020年05月29日 09:41:21   作者:汪星沒有熊  
這篇文章主要為大家詳細介紹了android surfaceView實現(xiàn)播放視頻功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了android surfaceView實現(xiàn)播放視頻的具體代碼,供大家參考,具體內容如下

RelativeLayout

<?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"
  tools:context=".MainActivity">

  <com.example.examday11_4_1.surfaceview.MySurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="250dp" />

  <TextView
    android:id="@+id/te_nowTiem"
    android:textColor="#fff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_marginLeft="60dp"
    android:layout_marginBottom="10dp"
    android:text="00:00" />

  <SeekBar
    android:id="@+id/sb"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="10dp" />

  <TextView
    android:id="@+id/te_allTiem"
    android:textColor="#fff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/sv"
    android:layout_marginLeft="320dp"
    android:layout_marginBottom="10dp"
    android:text="00:00" />

  <Button
    android:id="@+id/but_play"
    android:layout_width="50dp"
    android:layout_height="40dp"
    android:layout_alignBottom="@+id/sv"
    android:layout_marginLeft="10dp"
    android:text="S/P"
    android:textSize="10sp" />

</RelativeLayout>

mySurfaceView

package com.example.examday11_4_1.surfaceview;

import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;
import java.text.SimpleDateFormat;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
  private SurfaceHolder surfaceHolder;
  private MediaPlayer mediaPlayer;

  public MySurfaceView(Context context) {
    super(context);
  }

  public MySurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
    surfaceHolder = getHolder();
    surfaceHolder.addCallback(this);
    if (mediaPlayer == null){
      mediaPlayer = new MediaPlayer();
    }
  }

  public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
  }

  public void setDataPath(String path){
    mediaPlayer.reset();
    try {
      mediaPlayer.setDataSource(path);
      mediaPlayer.prepareAsync();
      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
          mediaPlayer.start();
        }
      });
    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(surfaceHolder);
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    if (mediaPlayer!=null){
      mediaPlayer.release();
      mediaPlayer = null;
    }
  }

  //暫停/開始播放
  public void playOrNo(){
    if (mediaPlayer!=null){
      if (mediaPlayer.isPlaying()){
        mediaPlayer.pause();
      }else {
        mediaPlayer.start();
      }
    }
  }

  //拖動更新進度
  public void seekTo(int progress){
    if (mediaPlayer!=null){
      int duration = mediaPlayer.getDuration();
      int current = progress * duration /100;
      mediaPlayer.seekTo(current);
    }
  }

  //獲取播放進度
  public int getProgress(){
    if (mediaPlayer!=null){
      int druation = mediaPlayer.getDuration();
      int currentPosition = mediaPlayer.getCurrentPosition();
      int progress = currentPosition * 100 / druation;
      return progress;
    }
    return 0;
  }

  //獲取播放時長
  public String getCurrentTime(){
    if (mediaPlayer!=null){
      long currentPostion = mediaPlayer.getCurrentPosition();
      SimpleDateFormat format = new SimpleDateFormat("mm:ss");
      String f = format.format(currentPostion);
      return f+"";

    }
    return "";
  }

  //獲取時長
  public String getDuration(){
    if (mediaPlayer!=null){
      long duration = mediaPlayer.getDuration();
      SimpleDateFormat format = new SimpleDateFormat("mm:ss");
      return format.format(duration)+"";
    }
    return "";
  }

}

MainActivity

package com.example.examday11_4_1;

import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.examday11_4_1.surfaceview.MySurfaceView;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

  private MySurfaceView mySurfaceView;
  private TextView teNowTiem;
  private SeekBar sb;
  private TextView teAllTiem;
  private Button butPlay;
  private Timer timer;
  private Handler handler = new Handler();
  private String path ="http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
      requestPermissions(new String[]{
          Manifest.permission.READ_EXTERNAL_STORAGE
      },100);
    }
    initView();
    initTimer();

  }

  private void initTimer() {
    timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        final String currentTime = mySurfaceView.getCurrentTime();
        final String duration = mySurfaceView.getDuration();
        final int progress = mySurfaceView.getProgress();
        handler.post(new Runnable() {
          @Override
          public void run() {
            sb.setProgress(progress);//設置進度條
            teAllTiem.setText(duration);//設置總時長
            teNowTiem.setText(currentTime);//設置當前時長
          }
        });
      }
    },0,100);
  }

  private void initView() {
    mySurfaceView = (MySurfaceView) findViewById(R.id.sv);
    mySurfaceView.setDataPath(path);
    teNowTiem = (TextView) findViewById(R.id.te_nowTiem);
    sb = (SeekBar) findViewById(R.id.sb);
    teAllTiem = (TextView) findViewById(R.id.te_allTiem);
    butPlay = (Button) findViewById(R.id.but_play);

    //設置拖動
    sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser){
          mySurfaceView.seekTo(progress);//視頻播放拖動
        }
      }

      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {

      }

      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {

      }
    });

    //暫停播放
    butPlay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mySurfaceView.playOrNo();
      }
    });

  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android中設置組件半透明和透明的效果示例

    Android中設置組件半透明和透明的效果示例

    這篇文章主要給大家介紹了Android中設置組件半透明和透明效果的相關資料,文中給出了詳細的介紹和示例代碼,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Android Flutter實現(xiàn)3D動畫效果示例詳解

    Android Flutter實現(xiàn)3D動畫效果示例詳解

    在Flutter中提供了AnimatedWidget組件用于構建可復用的動畫組件。本文我們用AnimatedWidget來實現(xiàn)組件的3D旋轉效果,感興趣的可以了解一下
    2022-03-03
  • Activity生命周期實例講解

    Activity生命周期實例講解

    這篇文章介紹了Activity中7個與生命周期有關的函數,使用實例代碼說明他們的使用方法
    2013-11-11
  • Android啟動屏實現(xiàn)左右滑動切換查看功能

    Android啟動屏實現(xiàn)左右滑動切換查看功能

    這篇文章主要介紹了Android啟動屏實現(xiàn)左右滑動切換查看功能的相關資料,針對新功能屬性介紹和啟動屏進行詳細講解,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android5.0新特性詳解之全新的動畫

    Android5.0新特性詳解之全新的動畫

    這篇文章主要介紹了Android5.0新特性詳解之全新的動畫的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Android 防止過快(多次)點擊的實現(xiàn)方法

    Android 防止過快(多次)點擊的實現(xiàn)方法

    很多用戶經常會出現(xiàn)過快且多次點擊同一按鈕的情況,本篇文章主要介紹了Android 防止過快點擊的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android中Shape的用法詳解

    Android中Shape的用法詳解

    工作中總是會用到shape去畫一些背景,每次都要去百度,但是很多都寫的很模糊或者屬性不是很全,所以今天自己總結了一下,給大家分享一下,自己以后也可以看
    2017-07-07
  • Android?雙屏異顯自適應Dialog的實現(xiàn)

    Android?雙屏異顯自適應Dialog的實現(xiàn)

    Android 多屏互聯(lián)的時代,必然會出現(xiàn)多屏連接的問題,本文主要介紹了Android?雙屏異顯自適應Dialog的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Android開發(fā)之AAR文件的生成與使用步驟

    Android開發(fā)之AAR文件的生成與使用步驟

    Android中的aar主要是針對于Android Library而言的,可以簡單的理解為是對Android Library的打包,這個包的格式為.aar,下面這篇文章主要給大家介紹了關于Android開發(fā)之AAR文件的生成與使用步驟的相關資料,需要的朋友可以參考下
    2022-07-07
  • Android實現(xiàn)音樂播放器歌詞顯示效果

    Android實現(xiàn)音樂播放器歌詞顯示效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)音樂播放器歌詞顯示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

隆化县| 北川| 思茅市| 平塘县| 静宁县| 彰武县| 柳江县| 广元市| 尖扎县| 凉城县| 临安市| 望城县| 沈丘县| 同江市| 军事| 尖扎县| 无棣县| 福鼎市| 嵊泗县| 新绛县| 康平县| 盱眙县| 清原| 巢湖市| 社旗县| 军事| 缙云县| 临高县| 中西区| 乐陵市| 灵山县| 汽车| 公主岭市| 循化| 峨山| 娱乐| 昌江| 嘉峪关市| 碌曲县| 拜城县| 华阴市|