CenterCrop的核心是使用TextureView的setTransform方法来实现对视频区域的变换。
思路来自于:github
因为产品需求的原因,在展示视频的时候需要使用类似ImageView的CenterCrop属性。对指定区域进行填充,对视频等比放大。
重写了TextureView,在其中使用MediaPlayer来播放视频。(上面库的ScalableVideoView 类里面)
我的实现是在重写TextureView的View的onMeasure方法里面进行如下计算,来实现centerCrop:
int viewWidth = getDefaultSize(mVideoWidth, widthMeasureSpec);
int viewHeight = getDefaultSize(mVideoHeight, heightMeasureSpec);
setMeasuredDimension(viewWidth, viewHeight);
float scaleX = viewWidth * 1.0f / mVideoWidth;
float scaleY = viewHeight * 1.0f / mVideoHeight;
float maxScale = Math.max(scaleX, scaleY);
//中心位置
int pivotPointX = viewWidth / 2;
int pivotPointY = viewHeight / 2;
//初始效果是填满View,相当于fitXY. 这里从fitXY变成centerCrop..
mMatrix.setScale(maxScale / scaleX , maxScale / scaleY, pivotPointX, pivotPointY);
setTransform(mMatrix);