20

Android の VideoView で、ImageView.ScaleType.CENTER_CROP と同じ効果を得る方法はありますか?

つまり、VideoView でビデオを再生して、歪みなく画面全体に表示されるようにしたいと考えています。ビデオの縦横比が画面に正確に適合しない場合は、歪ませるのではなくトリミングする必要があります。

次のソリューションは画面いっぱいに表示されますが、ビデオのアスペクト比は維持されません: https://stackoverflow.com/a/6927300/1068656

また、このソリューションはビデオのアスペクト比を維持しますが、画面全体を埋めることはありません (ビデオは長辺が画面の端に当たるまで拡大縮小され、横にバーが表示されます): https://stackoverflow.com/a/4855315/1068656

4

3 に答える 3

15

手遅れですが、同じ問題を探している他の誰かを助けるかもしれません. 次の回答は、アスペクト比(videoProportion)を維持します。ビデオビューの余分な部分は、電話のビューによって切り取られます。

private void setDimension() {
     // Adjust the size of the video
     // so it fits on the screen
     float videoProportion = getVideoProportion();
     int screenWidth = getResources().getDisplayMetrics().widthPixels;
     int screenHeight = getResources().getDisplayMetrics().heightPixels;
     float screenProportion = (float) screenHeight / (float) screenWidth;
     android.view.ViewGroup.LayoutParams lp = videoView.getLayoutParams();

     if (videoProportion < screenProportion) {
         lp.height= screenHeight;
         lp.width = (int) ((float) screenHeight / videoProportion);
     } else {
         lp.width = screenWidth;
         lp.height = (int) ((float) screenWidth * videoProportion);
     }
     videoView.setLayoutParams(lp);
 }

// This method gets the proportion of the video that you want to display.
// I already know this ratio since my video is hardcoded, you can get the  
// height and width of your video and appropriately generate  the proportion  
//    as :height/width 
private float getVideoProportion(){
  return 1.5f;
}
于 2014-10-27T12:13:40.473 に答える
12

Android の VideoView で、ImageView.ScaleType.CENTER_CROP

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="@dimen/dimen_0dp"
        android:layout_height="@dimen/dimen_0dp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

コトリンでは:

videoView.setOnPreparedListener { mediaPlayer ->
    val videoRatio = mediaPlayer.videoWidth / mediaPlayer.videoHeight.toFloat()
    val screenRatio = videoView.width / videoView.height.toFloat()
    val scaleX = videoRatio / screenRatio
    if (scaleX >= 1f) {
        videoView.scaleX = scaleX
    } else {
        videoView.scaleY = 1f / scaleX
    }
}

Java の場合:

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
      float videoRatio = mp.getVideoWidth() / (float) mp.getVideoHeight();
      float screenRatio = videoView.getWidth() / (float) 
      videoView.getHeight();
      float scaleX = videoRatio / screenRatio;
      if (scaleX >= 1f) {
          videoView.setScaleX(scaleX);
      } else {
          videoView.setScaleY(1f / scale);
      }
   }
});

そして、これは私にとってはうまくいきました。これが誰かを助けることを願っています。

于 2020-04-21T03:19:16.073 に答える