Как получить высоту VideoView, включенную в действие

Мне нужно получить высоту VideoView моей активности в 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

Может ли кто-нибудь сказать мне, что я делаю ошибку.


person Pravinsingh Waghela    schedule 15.01.2015    source источник
comment
Правинсингх Вагела, где вы называете эти методы? В onCreate?   -  person 2Dee    schedule 15.01.2015
comment
@2Dee Да в onCreate(). Это моя деятельность, а не фрагмент.   -  person Pravinsingh Waghela    schedule 15.01.2015
comment
Пожалуйста, просмотрите мой ответ. Вызов getHeight не будет работать должным образом в onCreate   -  person 2Dee    schedule 15.01.2015


Ответы (4)


Вы пытаетесь получить ширину/высоту до того, как представление будет нарисовано.

Попробуй это:

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

view.post(Runnable) вызывает добавление исполняемого объекта в очередь сообщений. Runnable будет работать в потоке пользовательского интерфейса.

person Hemanth    schedule 15.01.2015
comment
Я проголосовал за ваши ответы за то, что предложил вариант Runnable и смог оправдать этот выбор. Спасибо. - person 2Dee; 15.01.2015

Я проверил код этого кода на своем конце. Незадолго до завершения onCreate(). Просто напишите эти строки.

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

            @Override
            public void run() {

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

Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

person droidd    schedule 15.01.2015
comment
Выполняемый запуск в потоке пользовательского интерфейса, а не в другом потоке. Да. Я всегда использую это на своем конце, и это проверенный код. - person droidd; 15.01.2015
comment
Это правильно, но жаль, что вы не смогли объяснить, почему это работает, как это сделал aroll_123. - person 2Dee; 15.01.2015

Вы можете вызвать getWidth и getHeight в onCreate, но вы не можете быть уверены, что 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 в своем представлении. Он будет помещен в конец очереди потока пользовательского интерфейса, поэтому при его запуске макет был измерен, и getHeight возвращает правильное измерение.

vv.post(new Runnable() { 
    @Override
    public void run() {
        // Use getHeight here
    }
});
person 2Dee    schedule 15.01.2015
comment
Теперь, почему вы отредактировали свой ответ. Вы просто копируете и вставляете другой ответ. Вы можете объяснить? - person droidd; 15.01.2015
comment
Да, могу, зачем тебе объяснение? Я исследовал вариант Runnable, чтобы понять, почему он работает, чего вы не делали, даже если предлагали такое решение. Я увидел, что это действительно рабочее решение, и добавил его в свой ответ, чтобы дать максимально полный ответ. - person 2Dee; 15.01.2015
comment
Я просто хочу сказать. Другие уже дали решение для runnable. затем вы редактируете, увидев там решения. - person droidd; 15.01.2015
comment
По крайней мере, я понимаю, что делаю, а это больше, чем вы можете сказать. Ты с ума сошел ? - person 2Dee; 15.01.2015

Попробуйте этот код, также проверьте эту ссылку для расчета удобных размеров

DisplayMetrics дм; // Объявить

// Обновить код этой строки

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)

person sherin    schedule 15.01.2015