Если установить макет SurfaceView равным wrap_content, не увеличит размер видео для воспроизведения с правильным соотношением сторон.
- SurfaceView - это оптимизированная поверхность рисования
- Видео отображается в SurfaceView, не содержится в нем
wrap_content является синонимом fill_parent для SurfaceView.
То, что вы хотите сделать, - это получить размеры вашего видео из объекта MediaPlayer.Затем вы можете установить соотношение сторон SurfaceView для соответствия видео.
Некоторая базовая инициализация
public class YourMovieActivity extends Activity implements SurfaceHolder.Callback {
private MediaPlayer mp = null;
//...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mp = new MediaPlayer();
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
//...
}
}
Тогда хорошие вещи.Я опустил проверку ошибок здесь, чтобы уменьшить код, вызовы MediaPlayer должны быть обернуты в попытку {}.
@Override
public void surfaceCreated(SurfaceHolder holder) {
mp.setDataSource("/sdcard/someVideo.mp4");
mp.prepare();
//Get the dimensions of the video
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
//Get the width of the screen
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
//Get the SurfaceView layout parameters
android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
//Set the width of the SurfaceView to the width of the screen
lp.width = screenWidth;
//Set the height of the SurfaceView to match the aspect ratio of the video
//be sure to cast these as floats otherwise the calculation will likely be 0
lp.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth);
//Commit the layout parameters
mSurfaceView.setLayoutParams(lp);
//Start video
mp.start();
}
Обратите внимание, что этот код делает некоторые предположения относительно размеров вашего видео.Как есть, он максимизирует ширину и предполагает, что высота не превышает высоту экрана.
Возможно, вы захотите указать высоту вместо ширины, также вы можете проверить расчет размера и убедиться, что он не больше экрана или экрана - other_layout_elements.