EXOPlayer居中播放,類似ImageView的CENTER_CROP
1、自定義TextureView
import android.content.Context;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.TextureView;
/**
* 視訊自動居中裁剪自定義TextureView
*/
public class TextureVideoView extends TextureView{
private float mVideoHeight;
private float mVideoWidth;
private ScaleType mScaleType;
public enum ScaleType {
CENTER_CROP, TOP, BOTTOM
}
public void setWH(float mVideoWidth,float mVideoHeight){
this.mVideoWidth=mVideoWidth;
this.mVideoHeight=mVideoHeight;
updateTextureViewSize();
}
public TextureVideoView(Context context) {
super(context);
initView();
}
public TextureVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public TextureVideoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private void initView() {
setScaleType(ScaleType.CENTER_CROP);
}
public void setScaleType(ScaleType scaleType) {
mScaleType = scaleType;
}
private void updateTextureViewSize() {
float sx = (float) getWidth() / mVideoWidth;
float sy = (float) getHeight() / mVideoHeight;
Matrix matrix = new Matrix();
float maxScale = Math.max(sx, sy);
//第1步:把視訊區移動到View區,使兩者中心點重合.
matrix.preTranslate((getWidth() - mVideoWidth) / 2, (getHeight() - mVideoHeight) / 2);
//第2步:因為預設視訊是fitXY的形式顯示的,所以首先要縮放還原回來.
matrix.preScale(mVideoWidth / (float) getWidth(), mVideoHeight / (float) getHeight());
//第3步,等比例放大或縮小,直到視訊區的一邊超過View一邊, 另一邊與View的另一邊相等. 因為超過的部分超出了View的範圍,所以是不會顯示的,相當於裁剪了.
matrix.postScale(maxScale, maxScale, getWidth() / 2, getHeight() / 2);//後兩個引數座標是以整個View的座標系以參考的
setTransform(matrix);
}
}
二、設定mTextureVideoView.setScaleType(TextureVideoView.ScaleType.CENTER_CROP);屬性
三、當獲取到視訊的寬高時mTextureVideoView.setWH()
注:Exo獲取視訊寬高方法:
player.setVideoListener(new SimpleExoPlayer.VideoListener() {
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
//視訊寬和高
}
@Override
public void onRenderedFirstFrame() {
}
});
}
相關文章
- Android ImageView和TextView居中AndroidTextView
- Android圖片底部居中的ImageViewAndroidView
- android 中ImageView 無法居中AndroidView
- Android:ImageView圖片縮放、居中AndroidView
- Android中ImageView無法居中的問題AndroidView
- RN自定義元件封裝 - 播放類似PPT動畫元件封裝動畫
- ExoPlayer基本使用和關鍵類流程
- iOS AVPlayer之無縫切換播放(類似今日頭條視訊播放效果)iOS
- iOS開發之imageView居中顯示圖片iOSView
- android imageview圖片居中技巧應用AndroidView
- 自己動手寫類似酷狗播放器(2)_音樂播放模組實現播放器
- 動態的新增ImageView到LinearLayout中並居中顯示View
- 基於ExoPlayer的ExoVideoViewIDEView
- 自己動手寫類似酷狗播放器(4)_滑鼠右鍵選單的新增播放器
- 自己動手寫類似酷狗播放器(4)_系統托盤的顯示播放器
- 類似gitbook的wiki選擇Git
- mysql類似merge的操作MySql
- 自己動手寫類似酷狗播放器(5)_檔案的儲存和讀取播放器
- Android視訊開發進階(part5-ExoPlayer分析1,ExoPlayer的handler)Android
- 自己動手寫類似酷狗播放器(3)_Slider控制元件使用播放器IDE控制元件
- android 相對佈局,程式碼建立imageview,佈局居中問題AndroidView
- ElasticSearch類似Mysql的not in 和 in 查詢ElasticsearchMySql
- RabbitMQ推出類似Kafka的流StreamMQKafka
- 類似列表的view伸縮動畫View動畫
- 【Swift】類似於微博、微信的ActionSheetSwift
- 自己動手寫類似酷狗播放器(6)_UI初步改善_新增背景色播放器UI
- PostgreSQL類似OracleMERGE功能的實現SQLOracle
- Excel有類似“分列”的“分行”功能嗎?Excel
- 類似資料字典的幾個表
- 轉:類似SQL中的split函式SQL函式
- ExoPlayer的使用與解析(官方文件翻譯)
- jquery操作類似tab佈局jQuery
- ThinkPHP 類似 AOP 思想的引數驗證PHP
- VSCode中類似Postman的外掛VSCodePostman
- carlo:類似Electron.js的谷歌平臺JS谷歌
- 使用VuePress搭建一個類似element的文件Vue
- 類似if一樣的自定義程式碼塊
- Ubuntu中類似工作管理員的東西?Ubuntu