我有一个设置为scaleType = fitCenter的ImageView和一个位于帧布局内的TextureSurface:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/imageStart"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srcCompat="@drawable/splash_image_start"
android:padding="0dp"
android:scaleType="fitCenter"
android:adjustViewBounds="false"/>
<TextureView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible"/>
</FrameLayout>
活动加载后,我希望在视频加载时显示 splash_image_start 图片,并立即开始播放视频。
splash_image_start 为1080x1920像素,与视频大小完全匹配。
一切正常,但是视频开始播放,ImageView中显示的第一帧的宽度略有增加。
具体来说,要在播放时将第一帧与视频完全匹配,我需要将媒体播放器的x比例缩放1%:
mediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int videoWidth, int videoHeight) {
Log.v(TAG, "MediaPlayer video size changed");
float viewWidth = sv.getWidth();
float viewHeight = sv.getHeight();
int pivotPointX = (int) (viewWidth / 2);
int pivotPointY = (int) (viewHeight / 2);
Matrix matrix = new Matrix();
// Completely unknown as to why but when trying to match a video render against
// a static frame render there is a 0.1% difference in scale X
matrix.setScale(0.9f, 1.0f, pivotPointX, pivotPointY);
sv.setTransform(matrix);
}
});
我已经尝试了ImageView中的各种配置,以及使用mediaPlayer.setVideoScalingMode都没有结果。
除非我实际上将video scaleX设置为0.9f,否则始终存在差异。在多种设备上尝试过。
所以我的问题是,为什么我需要将scaleX设置为0.9f才能使视频与第一帧图像完全匹配?有没有更好的方法可以将ImageView中的第一帧与视频回放精确匹配?
PS:我从一个隐藏的TextureView开始,当视频加载时,我在该视图中显示和播放。工作良好。