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

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

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

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

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();
      }
    }
  }

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

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

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

    }
    return "";
  }

  //獲取時(shí)長
  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);//設(shè)置進(jìn)度條
            teAllTiem.setText(duration);//設(shè)置總時(shí)長
            teNowTiem.setText(currentTime);//設(shè)置當(dāng)前時(shí)長
          }
        });
      }
    },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);

    //設(shè)置拖動
    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();
      }
    });

  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

    Android中設(shè)置組件半透明和透明的效果示例

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

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

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

    Activity生命周期實(shí)例講解

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

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

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

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

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

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

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

    Android中Shape的用法詳解

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

    Android?雙屏異顯自適應(yīng)Dialog的實(shí)現(xiàn)

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

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

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

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

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

最新評論

辰溪县| 抚顺县| 惠来县| 海口市| 渭源县| 石渠县| 高安市| 上栗县| 广德县| 临西县| 祁东县| 安徽省| 景东| 铜梁县| 嘉善县| 双流县| 隆化县| 长岛县| 桑植县| 敦化市| 夏津县| 临高县| 古浪县| 安国市| 怀柔区| 阿勒泰市| 闽侯县| 抚顺市| 中卫市| 台东县| 景洪市| 于都县| 宁德市| 鹤山市| 塔河县| 香河县| 贵南县| 咸阳市| 海丰县| 石家庄市| 余庆县|