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圖片底部居中的ImageViewAndroidView
- 簡單使用exoplayer播放HLS
- 動態的新增ImageView到LinearLayout中並居中顯示View
- RN自定義元件封裝 - 播放類似PPT動畫元件封裝動畫
- FFmpeg開發筆記(五十六)使用Media3的Exoplayer播放網路影片筆記
- 基於ExoPlayer的ExoVideoViewIDEView
- 類似gitbook的wiki選擇Git
- VSCode中類似Postman的外掛VSCodePostman
- ElasticSearch類似Mysql的not in 和 in 查詢ElasticsearchMySql
- RabbitMQ推出類似Kafka的流StreamMQKafka
- PostgreSQL類似OracleMERGE功能的實現SQLOracle
- 最大似然分類器
- “警車”的“警燈”,類似於GIF
- ExoPlayer的使用與解析(官方文件翻譯)
- mysql 效果類似split函式MySql函式
- e語言 類似eval函式作用的函式
- 類似Tower的而故事還沒結束
- ThinkPHP 類似 AOP 思想的引數驗證PHP
- carlo:類似Electron.js的谷歌平臺JS谷歌
- 使用VuePress搭建一個類似element的文件Vue
- 類似trello的區域網開源的軟體
- 類似優酷 url 的生成是怎麼生成的?
- MySQL 06 mysql 如何實現類似 oracle 的 merge intoMySqlOracle
- 小程式的wxs指令碼(類似過濾器)指令碼過濾器
- 用Vue仿了一個類似抖音的AppVueAPP
- 有沒有類似上線釋出管理的工具
- Solon 1.6.11 釋出。類似 Spring 的生態體系Spring
- Solon 1.6.12 釋出,類似 Spring 的生態體系Spring
- 教你如何用SQLite 實現if not exist 類似功能的操作SQLite
- 用 golang 去實現類似 swoole 的 websocket 服務 ?GolangWeb
- 【like-react】手寫一個類似 react 的框架React框架
- 【Go】類似csv的資料日誌元件設計Go元件
- 如何實現類似 lodash 的 get 與 merge 函式函式
- RemoteBrowser:類似Puppeteer的瀏覽器自動化框架REM瀏覽器框架
- 去除類似AB和BA這樣的重複行
- PowerToys外掛擴充套件(類似Alfred)套件Alfred
- 類似淘票票 選座功能(svg)SVG
- 小程式底部彈框 類似picker效果
- Wez:Rust編寫的類似Powershell的終端模擬器Rust