У меня есть ImageView, для которого установлено scaleType = fitCenter и 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.
В частности, для точного соответствия первого кадра с видео при воспроизведении мне нужно преобразовать медиаплеер на 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, но безрезультатно.
Если я на самом деле не установил масштаб видео X на 0,9f, разница всегда есть. Пробовал на нескольких устройствах.
Итак, мой вопрос, есть ли объяснение, почему мне нужно установить scaleX равным 0,9f, чтобы видео точно совпадало с изображением первого кадра? Есть ли лучший способ точного сопоставления первого кадра в ImageView с воспроизведением видео?
PS: я начинаю со скрытого TextureView, и когда видео загружается, я показываю и играю в этом представлении. Работает отлично.