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



更多相关文章

  1. Android SurfaceView 实现实时显示摄像头视频
  2. Android 使用MediaPlayer播放视频切换后台暂停再恢复互前台继续
  3. Android 音视频开发总结
  4. android 播放视频 Android 播放音频
  5. 推荐一款视频转换软件免费无插件ipad/iphone/Android/YouTube适
  6. android 基于ffmpeg将视频采集的nv21转h264格式数据
  7. Android的raw下视频文件的读写-日记
  8. Android三种播放视频的方式
  9. Android 实时视频采集/编码/传输/解码/播放—方案调研

随机推荐

  1. 如何在Android真机上检测是否有Google Ma
  2. 整理 酷炫 Android、Flutter 开源UI框架
  3. SSH服务器与Android通信(2)--Android客户
  4. Android(安卓)TV 焦点控制逻辑
  5. Activity的四种启动模式和onNewIntent()
  6. android google地图定位开发,且可以自由移
  7. android sdk 文件目录含义介绍
  8. android通知栏进度条
  9. 【源码分享下载】每日更新之Android快速
  10. Android菜单详解(二)——创建并响应选项菜