获取控件的高和宽

问题

如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth、getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单的,不信的话,你可以去试一下,在onCreate里面,你是无法获得长宽值的,始终为0。

原因

这是为什么呢,其实熟悉view绘制流程的朋友应该一眼就看出来了,在onCreate中,我们的控件其实还并没有画好,换句话说,等onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。

解决

No1:

?


1

2

3

4

5

6

7

int w = View.MeasureSpec.makeMeasureSpec(0,

                View.MeasureSpec.UNSPECIFIED);

        int h = View.MeasureSpec.makeMeasureSpec(0,

                View.MeasureSpec.UNSPECIFIED);

        imageView.measure(w, h);

        int height = imageView.getMeasuredHeight();

        int width = imageView.getMeasuredWidth();

这种方法很简单,就是我们自己来测量

No2:

?


1

2

3

4

5

6

7

8

9

ViewTreeObserver vto = imageView.getViewTreeObserver();

        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

            public boolean onPreDraw() {

                vto.removeOnPreDrawListener(this);

                int height = imageView.getMeasuredHeight();

                int width = imageView.getMeasuredWidth();

                return true;

            }

        });

这个方法,我们需要注册一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听绘图的,既然是监听绘图,那么我们自然可以获取测量值了,同时,我们在每次监听前remove前一次的监听,避免重复监听。

No3:


1

2

3

4

5

6

7

8

9

ViewTreeObserver vto = imageView.getViewTreeObserver();  

        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override

            public void onGlobalLayout() {

                imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

                imageView.getHeight();

                imageView.getWidth();

            }  

        });

时间: 2024-10-13 01:11:38

获取控件的高和宽的相关文章

【Android】获取控件的宽和高

有时候我们须要在Activity的时候获取控件的宽和高来做一些操作,以下介绍三种获取宽和高的方式: 1. onWindowFocusChanged @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { int width = image.getMeasuredWidth(); int height = image.ge

uwp - 获取控件的宽高

在wpf可以通过控件.Width/Height来获取宽高,来到uwp上却没效果,在微软的开发人员中心找到了答案. 所以,我们要在后台获取控件的宽高应该是:控件.ActualHeight/ActualWidth.

android获取屏幕宽高与获取控件宽高

获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px) int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高(像素,如:800p) Log.e(TAG + " getDefaultDisplay", "screen

android 获取屏幕宽高 和 获取控件坐标

一.获取屏幕宽高: (1). WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); (2). WindowManager wm = this.getWindowManager(); int width = wm

android获取控件宽高和屏幕宽高

一.获取屏幕宽高 1.android界面简单介绍 要获取屏幕宽高,我们可以先从android的界面构成了解 android的界面主要由三部分构成:1.状态栏 2.标题栏 3.内容区域 \ (1)状态栏 状态栏主要用来显示一些系统图标,应用的通知图标和系统时间. (2)标题栏 android中标题栏主要用来显示当前位置,3.0过后添加了ActionBar,拥有了导航和OptionMenu的功能,5.0又新添加了ToolBar控件,和ActionBar类似,但自定义的空间更充足 (3)内容区域 an

android动态设置控件的高宽

关键代码: LayoutParams para; para = mTabImg.getLayoutParams(); para.width=one; mTabImg.setLayoutParams(para); mTabImg是你要设置的控件  首先拿到后就可以设置 Display currDisplay = getWindowManager().getDefaultDisplay();// 获取屏幕当前分辨率 int displayWidth = currDisplay.getWidth();

WPF获取控件内部的ScrollViewer,并控制ScrollViewer操作

//获取内部  ScrollViewer方法 public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject        {            if (obj != null)            {                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)          

.net OCX 无法获取“****”控件的窗口句柄,不支持无窗口的ActiveX控 新解决方法

朋友找我帮原来的软件加一个小功能,程序是用VB.NET 写的. 软件需要与外部串口设备通信,一只带串口功能的压力表. 应该时间周期很急,所以串口部分我就直接用厂家提供的VB DEMO 写了个OCX控件给 .NET调用. OCX 的制作过程参考我的这篇文章 http://my.oschina.net/caomenglong/blog/380029 软件制作完成用用VS做了一个安装包给朋友,安装包内已经包含了OCX控件.安装过程中会自动注册. 朋友去给客户安装,发现提示 『 无法获取"****&qu

UiAutomator源码分析之获取控件信息

根据上一篇文章<UiAutomator源码分析之注入事件>开始时提到的计划,这一篇文章我们要分析的是第二点: 如何获取控件信息 我们在测试脚本中初始化一个UiObject的时候通常是像以下这个样子: UiObject appsTab = new UiObject(new UiSelector().text("Apps")); appsTab.click() 那么这个过程发生了什么呢?这就是我们接下来要说的事情了. 1. 获取控件信息顺序图 这里依然是一个手画的不规范的顺序图