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



我需要获取我在 android 中活动的 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

有人可以告诉我我犯了什么错误。

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

试试这个:

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

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

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

VideoView videoView = (VideoView) findViewById(R.id.videoView);
videoView.post(new Runnable() {
            @Override
            public void run() {
                Log.e("",""+videoView.getHeight()+" "+videoView.getWidth());
            }
        });

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

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

试试这个代码 还要检查此链接以计算方便的尺寸

DisplayMetrics dm;//Declare

更新此行代码

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(可运行)中运行

最新更新