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

Android中使用TextureView播放視頻

 更新時(shí)間:2018年04月03日 16:10:47   投稿:wdc  
Android使用SurfaceView播放視頻不能使用變換,本文教你如何在Android中使用TextureView播放視頻平移、縮放、旋轉(zhuǎn)設(shè)置透明度

如果你想顯示一段在線視頻或者任意的數(shù)據(jù)流比如視頻或者OpenGL 場景,你可以用android中的SurfaceView或者TextureView做到。

1).TextureView的兄弟SurfaceView

應(yīng)用程序的視頻或者opengl內(nèi)容往往是顯示在一個(gè)特別的UI控件中:SurfaceView。

SurfaceView的工作方式是創(chuàng)建一個(gè)置于應(yīng)用窗口之后的新窗口。這種 方式的效率非常高,因?yàn)镾urfaceView窗口刷新的時(shí)候不需要重繪應(yīng)用程序的窗口(android普通窗口的視圖繪制機(jī)制是一層一層的,任何一個(gè)子元素或者 是局部的刷新都會(huì)導(dǎo)致整個(gè)視圖結(jié)構(gòu)全部重繪一次,因此效率非常低下,不過滿足普通應(yīng)用界面的需求還是綽綽有余),但是SurfaceView也有一些非常  不便的限制。

因?yàn)镾urfaceView的內(nèi)容不在應(yīng)用窗口上,所以不能使用變換(平移、縮放、旋轉(zhuǎn)等)。也難以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()。

2).Android 4.0中的TextureView。

為了解決這個(gè)問上面那個(gè)我們剛說到的問題Android 4.0中引入了TextureView;

TextureView與SurfaceView相比,TextureView并沒有創(chuàng)建一個(gè)單獨(dú)的Surface用來繪制,這使得它可以像一般的View一樣執(zhí)行一些變換操作,設(shè)置透明度等。

另外,Textureview必須在硬件加速開啟的窗口中。

項(xiàng)目中碰到的問題:

1.之前用SurfaceView播放視頻的時(shí)候,從圖片切換到播放視頻,會(huì)出現(xiàn)黑屏的現(xiàn)象。

2.SurfaceView靈活性沒有TextureView好。

下面是實(shí)現(xiàn)源碼,大家參考一下

MainActivity.java文件

package com.example.textureviewvideo; 
 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
 
import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.SurfaceTexture; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.Surface; 
import android.view.TextureView; 
import android.view.View; 
import android.view.TextureView.SurfaceTextureListener; 
import android.widget.ImageView; 
 
public class MainActivity extends Activity implements SurfaceTextureListener{ 
// private TextureView textureView; 
  private MediaPlayer mMediaPlayer; 
  private Surface surface; 
   
  private ImageView videoImage; 
   
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TextureView textureView=(TextureView) findViewById(R.id.textureview); 
    textureView.setSurfaceTextureListener(this);//設(shè)置監(jiān)聽函數(shù) 重寫4個(gè)方法 
     
//   textureView=new TextureViewTest(this); 
//   setContentView(textureView); 
    videoImage=(ImageView) findViewById(R.id.video_image); 
  } 
   
  @Override 
  public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,int height) { 
    System.out.println("onSurfaceTextureAvailable onSurfaceTextureAvailable"); 
    surface=new Surface(surfaceTexture); 
    new PlayerVideo().start();//開啟一個(gè)線程去播放視頻 
  } 
  @Override 
  public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,int height) { 
    System.out.println("onSurfaceTextureSizeChanged onSurfaceTextureSizeChanged"); 
  } 
   
  @Override 
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { 
    System.out.println("onSurfaceTextureDestroyed onSurfaceTextureDestroyed"); 
    surfaceTexture=null; 
    surface=null; 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    return true; 
  } 
   
  @Override 
  public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { 
//   System.out.println("onSurfaceTextureUpdated onSurfaceTextureUpdated"); 
  } 
   
  private class PlayerVideo extends Thread{ 
    @Override 
    public void run(){ 
       try { 
         File file=new File(Environment.getExternalStorageDirectory()+"/ansen.mp4"); 
         if(!file.exists()){//文件不存在 
           copyFile(); 
         } 
         mMediaPlayer= new MediaPlayer(); 
         mMediaPlayer.setDataSource(file.getAbsolutePath());  
         mMediaPlayer.setSurface(surface); 
         mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
         mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
          @Override 
          public void onPrepared(MediaPlayer mp){ 
            videoImage.setVisibility(View.GONE); 
            mMediaPlayer.start(); 
          } 
         }); 
         mMediaPlayer.prepare(); 
       } catch (Exception e) {  
         e.printStackTrace(); 
       } 
    } 
  } 
   
  public interface PlayerController{ 
    public void play(); 
  } 
   
  /** 
   * 如果sdcard沒有文件就復(fù)制過去 
   */ 
  private void copyFile() { 
    AssetManager assetManager = this.getAssets(); 
    InputStream in = null; 
    OutputStream out = null; 
    try { 
      in = assetManager.open("ansen.mp4"); 
      String newFileName = Environment.getExternalStorageDirectory()+"/ansen.mp4"; 
      out = new FileOutputStream(newFileName); 
      byte[] buffer = new byte[1024]; 
      int read; 
      while ((read = in.read(buffer)) != -1) { 
        out.write(buffer, 0, read); 
      } 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
    } catch (Exception e) { 
      Log.e("tag", e.getMessage()); 
    } 
  } 
}

TextureView創(chuàng)建的時(shí)顯示圖片,然后初始化播放器,預(yù)加載視頻,如果視頻文件不存在,從assets下copy一份到sdcard目錄下,視頻加載完畢隱藏圖片,我這邊圖片默認(rèn)顯示的是android項(xiàng)目自帶的圖片,你們可以根據(jù)需求顯示想要的圖片。

activity_main.xml布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" > 
 
  <TextureView 
    android:id="@+id/textureview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
   
   
  <ImageView 
    android:id="@+id/video_image" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/ic_launcher"/> 
</RelativeLayout> 

放了一個(gè)TextureView跟一個(gè)ImageView  TextureView初始化顯示ImageView...當(dāng)視頻播放的時(shí)候隱藏ImageView,并且切換過去的時(shí)候不會(huì)出現(xiàn)黑屏。

如果播放在線視頻出現(xiàn)閃屏的問題,需要開啟一個(gè)線程異步播放視頻,然后再用handle延時(shí)隱藏圖片。我用的是延時(shí)300毫秒

private void sendEmpryMessage(){ 
  handler.sendEmptyMessageDelayed(0,300);//給主線程發(fā)送一個(gè)隱藏圖片的消息 
} 

最終效果

Demo源碼下載

相關(guān)文章

  • Android軟件啟動(dòng)動(dòng)畫及動(dòng)畫結(jié)束后跳轉(zhuǎn)的實(shí)現(xiàn)方法

    Android軟件啟動(dòng)動(dòng)畫及動(dòng)畫結(jié)束后跳轉(zhuǎn)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android軟件啟動(dòng)動(dòng)畫及動(dòng)畫結(jié)束后跳轉(zhuǎn)的實(shí)現(xiàn)方法,實(shí)例分析了Android圖片播放及定時(shí)器的相關(guān)使用技巧,非常具有使用價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android自定義收音機(jī)搜臺(tái)控件RadioRulerView

    Android自定義收音機(jī)搜臺(tái)控件RadioRulerView

    這篇文章主要為大家詳細(xì)介紹了Android自定義收音機(jī)搜臺(tái)控件RadioRulerView的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android實(shí)現(xiàn)消水果游戲代碼分享

    Android實(shí)現(xiàn)消水果游戲代碼分享

    本文給大家分享實(shí)現(xiàn)開心消水果游戲的核心代碼,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友一起看看吧
    2016-11-11
  • 10種提升android運(yùn)行效率的建議

    10種提升android運(yùn)行效率的建議

    這篇文章主要分享提升android運(yùn)行效率的建議,如何讓安卓程序在有限的內(nèi)存和電池資源下流暢快速有效率的運(yùn)行,下面給大家分享下面給出了10種實(shí)踐中的建議,需要的朋友可以參考一下
    2021-11-11
  • Android判斷SD卡是否已經(jīng)掛載的方法

    Android判斷SD卡是否已經(jīng)掛載的方法

    這篇文章主要介紹了Android判斷SD卡是否已經(jīng)掛載的方法,涉及Android監(jiān)聽方法BroadcastReceiver的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 解決Android 高CPU占用率的問題

    解決Android 高CPU占用率的問題

    最近測試測試APP的一個(gè)功能,發(fā)現(xiàn)點(diǎn)擊頁面上的按鈕后,CPU占有率比之前的版本要高,所以本文給大家介紹了如何解決Android 高CPU占用率的問題,需要的朋友可以參考下
    2023-09-09
  • Android圖片緩存之初識(shí)Glide(三)

    Android圖片緩存之初識(shí)Glide(三)

    這篇文章主要為大家詳細(xì)介紹了Android圖片緩存之Glide,學(xué)習(xí)比較優(yōu)秀的圖片緩存開源框架,感興趣的小伙伴們可以參考一下
    2016-08-08
  • android 中 SQLiteOpenHelper的封裝使用詳解

    android 中 SQLiteOpenHelper的封裝使用詳解

    這篇文章主要介紹了android 中 SQLiteOpenHelper的封裝使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Android dataBinding與ListView及事件詳解

    Android dataBinding與ListView及事件詳解

    這篇文章主要介紹了Android dataBinding與ListView及事件詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • ionic2如何處理android硬件返回按鈕

    ionic2如何處理android硬件返回按鈕

    這篇文章主要為大家詳細(xì)介紹了ionic2如何處理android硬件返回按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評(píng)論

集贤县| 开鲁县| 眉山市| 泽普县| 普洱| 龙游县| 汾阳市| 吉首市| 砚山县| 五指山市| 柳河县| 高青县| 通许县| 鄯善县| 连云港市| 理塘县| 芜湖县| 永安市| 浦北县| 牡丹江市| 东乌珠穆沁旗| 德江县| 和顺县| 昌邑市| 梅州市| 马关县| 朝阳区| 柳林县| 大姚县| 连平县| 漠河县| 吐鲁番市| 庆元县| 聂荣县| 龙里县| 武邑县| 独山县| 牙克石市| 大冶市| 淮阳县| 卓尼县|