4种Android获取View宽高的方式
程序员文章站
2023-12-18 19:42:52
有时我们会有基于这样的需求,当activity创建时,需要获取某个view的宽高,然后进行相应的操作,但是我们在oncreate,onstart中获取view的大小,获取到...
有时我们会有基于这样的需求,当activity创建时,需要获取某个view的宽高,然后进行相应的操作,但是我们在oncreate,onstart中获取view的大小,获取到的值都是0,只是由于view的绘制工程还未完成,和在oncreate中弹出dialog或者popupwindow会报一个activity not running原理类似。
接下来就为大家介绍几种获取view宽高的方法:
第一种方式:重写activity中的onwindowfocuschanged,当activity获取到焦点的时候view已经绘制完成,也能获取到view的准确宽高了。同样的dialog和popupwindow也可以在这里弹出,需要注意的是这个方法会调用多次,当hasfocus为true时,才可进行相应的操作
@override public void onwindowfocuschanged(boolean hasfocus) { super.onwindowfocuschanged(hasfocus); if (hasfocus) { system.out.println("onwindowfocuschanged width=" + tvtest.getwidth() + " height=" + tvtest.getheight()); } }
第二种方式:
/** * 会执行多次 */ private void getsize1() { viewtreeobserver vto = tvtest.getviewtreeobserver(); vto.addonpredrawlistener(new viewtreeobserver.onpredrawlistener() { @override public boolean onpredraw() { int height = tvtest.getmeasuredheight(); int width = tvtest.getmeasuredwidth(); system.out.println("height" + height); system.out.println("width" + width); return true; } }); }
第三种方式:
private void getsize2() { viewtreeobserver viewtreeobserver = tvtest.getviewtreeobserver(); viewtreeobserver .addongloballayoutlistener(new ongloballayoutlistener() { @override public void ongloballayout() { tvtest.getviewtreeobserver() .removeglobalonlayoutlistener(this); system.out.println("ongloballayout width=" + tvtest.getwidth() + " height=" + tvtest.getheight()); } }); }
第四种方式:
private void getsize3() { tvtest.post(new runnable() { @override public void run() { system.out.println("postdelayed width=" + tvtest.getwidth() + " height=" + tvtest.getheight()); } }); }
以上就是android获取view宽高的4种方式,希望对大家的学习有所帮助。