2015-01-15 3 views
1

мне нужно, чтобы высота VideoView моей деятельности в андроиде, я использую следующие команды, но это дает мне Рост как 0.Как получить высоты VideoView, включенный в операции

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 

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

+0

Pravinsingh Waghela, где вы называете эти методы? В onCreate? – 2Dee

+0

@ 2Dee Да в onCreate(). Его деятельность, а не фрагмент. –

+0

Просьба прокомментировать мой ответ. Вызов getHeight не будет работать должным образом в onCreate – 2Dee

ответ

6

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

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

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

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

+2

Я проголосовал за ваши ответы за предложение опции Runnable и возможность обосновать этот выбор. Спасибо. – 2Dee

0

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

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 и `андроида: layout_height: match_parent, чтобы заполнить всю ширину и высоту экрана, а во избежание растягивания видео и для поддержания пропорции вы должны использовать видео с отношением размеров 16: 9

Вам нужно запустить в view.post (Runnable)

1

Вы можете позвонить 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 
    } 
}); 
+0

Теперь, почему вы отредактировали свой ответ. Вы просто скопируете вставить другой ответ. Вы можете объяснить? – droidd

+0

Да, я могу, для чего вам нужно объяснение? Я исследовал параметр Runnable, чтобы видеть * почему * он работал, чего вы не делали, даже если бы предлагали это решение. Я видел, что это действительно рабочее решение, и добавил к моему ответу, чтобы предоставить наиболее полный ответ. – 2Dee

+0

Я просто хочу сказать.Другие уже дали решение на runnable. затем вы редактируете, видя там решения. – droidd

2

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

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

      @Override 
      public void run() { 

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

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

+0

Runnable run в потоке пользовательского интерфейса, не в другой теме. Да. Я всегда использую это в конце, и это проверенный код. – droidd

+0

Это правильно, но грустно, что вы не могли объяснить * почему * это работает, как arol_123. – 2Dee

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