旋转屏幕时,表面视图中的视频无法正确显示

问题描述

问题仅在方向改变时发生。如果您立即以垂直状态运行它,则一切都会正确显示

enter image description here

如果立即在水平,那么也或多或少一切都很好

enter image description here

但是当你改变方向时,麻烦就来了:

enter image description here

enter image description here

代码如下:

import java.io.IOException;
import android.app.Activity;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.displayMetrics;
import android.util.Log;
import android.view.display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;



public class MainActivity extends Activity implements SurfaceHolder.Callback,MediaPlayer.OnPreparedListener,VideoControllerView.MediaPlayerControl {
    private SurfaceView videoSurface;
    private MediaPlayer player;
    private VideoControllerView controller;
    private RelativeLayout vidcontainer;
    private FrameLayout con;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        vidcontainer = (RelativeLayout) findViewById(R.id.video_container);
        con = (FrameLayout) findViewById(R.id.videoSurfaceContainer);

        videoSurface = (SurfaceView) findViewById(R.id.videoSurface);
        SurfaceHolder videoHolder = videoSurface.getHolder();
        videoHolder.addCallback(this);

        // инициализируем контроллер и плеера для данной активности
        player = new MediaPlayer();
        controller = new VideoControllerView(this);

        // инициализируем нашего плеера и запускаем сходу видео как только запускается активность
        try {
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
            player.setDataSource(this,Uri.parse("https://drive.google.com/uc?export=download&id=1Ql63EqziGH8480Fl7JhLnd1LfPWHe7vd"));
            player.setonPreparedListener(this);
        } catch (IllegalArgumentException e) {
            e.printstacktrace();
        } catch (SecurityException e) {
            e.printstacktrace();
        } catch (IllegalStateException e) {
            e.printstacktrace();
        } catch (IOException e) {
            e.printstacktrace();
        }
    }

    // показываем контроллы по косанию к экрану,не к видео
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        controller.show();
        return false;
    }


    // Implement SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) {
    }

    // подготавливаем видео к проигрыванию,как только загружаем его,показываем
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        player.setdisplay(holder);
        player.prepareAsync();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
    // End SurfaceHolder.Callback

    // Implement MediaPlayer.OnPreparedListener
    @Override
    public void onPrepared(MediaPlayer mp) {
        controller.setMediaPlayer(this);
        controller.setAnchorView((FrameLayout) findViewById(R.id.videoSurfaceContainer));
        toggleFullScreen();
        handleAspectRatio();

        player.start();

    }
    // End MediaPlayer.OnPreparedListener

    // Implement VideoMediaController.MediaPlayerControl
    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public int getCurrentPosition() {
        return player.getCurrentPosition();
    }

    @Override
    public int getDuration() {
        return player.getDuration();
    }

    @Override
    public boolean isPlaying() {
        return player.isPlaying();
    }

    @Override
    public void pause() {
        player.pause();
    }

    @Override
    public void seekTo(int i) {
        player.seekTo(i);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Toast toast3 = Toast.makeText(getApplicationContext(),"Жопа!",Toast.LENGTH_SHORT);
        toast3.show();
        handleAspectRatio();}

    @Override
    public void start() {
        player.start();
    }

    @Override
    public boolean isFullScreen() {
        return false;
    }

    public void onVideoSizeChanged(MediaPlayer mp,int w,int h) {

    }

    @Override
    public void toggleFullScreen() {

        displayMetrics metrics = new displayMetrics();
        getwindowManager().getDefaultdisplay().getMetrics(metrics);
        android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) vidcontainer.getLayoutParams();
        params.width = metrics.widthPixels;
        params.height = metrics.heightPixels;
        params.leftMargin = 0;
        vidcontainer.setLayoutParams(params);
    }
    // End VideoMediaController.MediaPlayerControl

    public void handleAspectRatio() {
        int surfaceView_Width = videoSurface.getWidth();
        int surfaceView_Height = videoSurface.getHeight();

        float video_Width = player.getVideoWidth();
        float video_Height = player.getVideoHeight();

        float ratio_width = surfaceView_Width/video_Width;
        float ratio_height = surfaceView_Height/video_Height;
        float aspectratio = video_Width/video_Height;

        ViewGroup.LayoutParams layoutParams = videoSurface.getLayoutParams();

        if (ratio_width > ratio_height){
            layoutParams.width = (int) (surfaceView_Height * aspectratio);
            layoutParams.height = surfaceView_Height;
        }else{
            layoutParams.width = surfaceView_Width;
            layoutParams.height = (int) (surfaceView_Width / aspectratio);
        }

        videoSurface.setLayoutParams(layoutParams);
    }}
xml代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/video_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:gravity="center_horizontal|center_vertical"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/videoSurfaceContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <SurfaceView
            android:id="@+id/videoSurface"
            android:layout_gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
</RelativeLayout>

如果在改变方向时调用toggleFullScreen()方法,同样显示不正确,视频没有拉伸到全屏:

enter image description here

enter image description here

更改手机方向时如何将视频拉伸至全屏?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)