Android 如何获取活动中包含的视频视图的高度

Android 如何获取活动中包含的视频视图的高度,android,android-videoview,mediacontroller,Android,Android Videoview,Mediacontroller,我需要在android中获取我活动的视频视图的高度,我使用以下命令,但它给我的高度为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);

我需要在android中获取我活动的视频视图的高度,我使用以下命令,但它给我的高度为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

有人能告诉我我犯了什么错误吗。

试试这段代码,也检查一下这段代码,以便计算方便的尺寸

数据挖掘//申报

//更新此行代码

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\u width:match\u parent和“android:layout\u height:match\u parent”来填充所有屏幕宽度和高度,避免视频拉伸并保持纵横比,则应使用尺寸比为16:9的视频


您需要在视图中运行。post(Runnable)

请尝试此代码,并检查此代码以计算方便的尺寸

数据挖掘//申报

//更新此行代码

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\u width:match\u parent和“android:layout\u height:match\u parent”来填充所有屏幕宽度和高度,避免视频拉伸并保持纵横比,则应使用尺寸比为16:9的视频


您需要在view.post(Runnable)

中运行。您可以在
onCreate
中调用
getWidth
getHeight
,但您无法确定
视图是否已完全创建,因此,这些方法将返回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);
        }
    }

});
或者,您可以在视图上发布
Runnable
。它将被放在UI线程队列的末尾,因此当它运行时,布局已经被测量,并且
getHeight
返回正确的测量值

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

您可以在
onCreate
中调用
getWidth
getHeight
,但无法确定
视图是否已完全创建,因此,这些方法将返回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);
        }
    }

});
或者,您可以在视图上发布
Runnable
。它将被放在UI线程队列的末尾,因此当它运行时,布局已经被测量,并且
getHeight
返回正确的测量值

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());
            }
        });

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

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

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

            @Override
            public void run() {

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

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

您正在尝试在绘制视图之前获取宽度/高度

试试这个:

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

view.post(Runnable)
导致将Runnable添加到消息队列中。runnable将在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;
                  }
                   });
试试这个:

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


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

Pravinsingh Waghela,您在哪里调用这些方法?在onCreate中?@2在onCreate()中查看是。这是我的活动,不是碎片。请回顾我的答案。在onCreatePravinsingh Waghela中调用getHeight将无法正常工作,您在哪里调用这些方法?在onCreate中?@2在onCreate()中查看是。这是我的活动,不是碎片。请回顾我的答案。调用getHeight在onCreateRunnable在UI线程上运行而不是在其他线程上运行时将无法正常工作。对我总是在结尾使用它,这是一个经过测试的代码。这是正确的,但遗憾的是你无法解释它为什么会像arol_123那样工作。Runnable在UI线程上运行,而不是在另一个线程上运行。对我总是在结尾使用这段代码,这是一段经过测试的代码。这是正确的,但遗憾的是你无法解释它为什么会像arol_123那样工作。现在,你为什么编辑你的答案。你只需复制粘贴另一个answwer。你能解释一下吗?是的,我能,你需要解释什么?我调查了Runnable选项,以了解它为什么会起作用,这是即使您提出该解决方案,您也没有做的事情。我看到这确实是一个有效的解决方案,并在我的回答中添加了这一点,以提供尽可能完整的答案。我只想说。其他人已经给出了runnable的解决方案。然后你在看到这些解决方案后编辑。至少我知道我在做什么,这比你能说的要多。你疯了?现在,你为什么编辑你的答案。你只需复制粘贴另一个answwer。你能解释一下吗?是的,我能,你需要解释什么?我调查了Runnable选项,以了解它为什么会起作用,这是即使您提出该解决方案,您也没有做的事情。我看到这确实是一个有效的解决方案,并在我的回答中添加了这一点,以提供尽可能完整的答案。我只想说。其他人已经给出了runnable的解决方案。然后你在看到这些解决方案后编辑。至少我知道我在做什么,这比你能说的要多。你疯了吗?我把你的答案投了赞成票,因为我建议了可运行的选项,并且能够证明这个选择是正确的。谢谢你。我投票支持你的答案,因为我建议了Runnable选项,并且能够证明这个选择是正确的。非常感谢。
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;
                  }
                   });