如何获取包含在 Activity 中的 VideoView 的高度

How to get the Height of the VideoView included in the Activity

我需要在 android 中获取我的 activity 的 VideoView 的高度,我正在使用以下命令,但它给我的高度为 0。

VideoView vv = (VideoView)findViewById(R.id.video1);
String surl="SOME_LINK.mp4";
        Uri uri=Uri.parse(surl);
        MediaController mc = new MediaController(this);
        vv.setVideoURI(uri);
        vv.setMediaController(mc);
        mc.setMediaPlayer(vv);
        mc.setAnchorView(vv);
        int vvHeight=vv.getMeasuredHeight();
        Log.d("VideoView Height:",vvHeight+""); // The Logcat output : 0.
        int VVheight=vv.getHeight();
        Log.d("The Height of VideoView is :",VVheight+""); // The Logcat output : 0

谁能告诉我我犯了什么错误。

尝试使用此代码并检查此 link 以计算方便的尺寸

DisplayMetrics dm; //声明

//更新这一行代码

dm = new DisplayMetrics(); 
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int height = dm.heightPixels;
int width = dm.widthPixels;

//也试试这行代码

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(uriString);
mp.prepare();
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();

注意:如果您使用 android:layout_width:match_parent 和 `android:layout_height:match_parent 来填充所有屏幕宽度和高度并避免视频拉伸并保持宽高比你应该使用尺寸比 16:9

的视频

您需要 运行 在 view.post(Runnable)

您可以在 onCreate 中调用 getWidthgetHeight,但您不能确定 View 是否已完全创建,因此,这些方法将 return 0。 作为替代方案,您可以使用 ViewTreeObserver :

VideoView vv = (VideoView)findViewById(R.id.video1);
ViewTreeObserver vto = vv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        // Use getHeight here
        ViewTreeObserver obs = vv.getViewTreeObserver();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            obs.removeOnGlobalLayoutListener(this);
        } else {
            obs.removeGlobalOnLayoutListener(this);
        }
    }

});

或者,您可以在视图中 post Runnable。会放在UI线程的队列末尾,所以在运行的时候布局已经测出来了,getHeightreturn是正确的测.

vv.post(new Runnable() { 
    @Override
    public void run() {
        // Use getHeight here
    }
});

我已经测试了这段代码。就在 onCreate() 结束之前。只需写下这些行。

VideoView videoView = (VideoView) findViewById(R.id.videoView);
videoView.post(new Runnable() {

            @Override
            public void run() {

                Log.e("",""+videoView.getHeight()+" "+videoView.getWidth());
            }
        });

如果您有任何疑问,请告诉我。

您正试图在绘制视图之前获取 width/height。

试试这个:

vv.post(new Runnable() { 
@Override
  public void run() {
    // get height and width here
  }
});

view.post(Runnable) 导致 运行nable 被添加到消息队列中。 运行nable 将在 UI 线程上 运行。

VideoView vv = (VideoView)findViewById(R.id.video1);

ViewTreeObserver vto = vv.getViewTreeObserver();

vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
 public boolean onPreDraw() {
     vv.getViewTreeObserver().removeOnPreDrawListener(this);
     finalHeight = vv.getMeasuredHeight();
     finalWidth = vv.getMeasuredWidth();
     Log.d("debug" , "" + "Height: " + finalHeight + " Width: " + finalWidth);
     return true;
                  }
                   });