首页 > 其他分享 >在Activity中测量控件宽高的三种方式

在Activity中测量控件宽高的三种方式

时间:2024-09-24 18:02:12浏览次数:1  
标签:控件 val tv 宽高 height width Activity

在进行Android开发时,有时需要测量控件的宽和高,常用的方式有以下三种:

(1)重写onWindowFocusChanged(hasFocus: Boolean)方法,在这个方法内获取控件的宽高

 这个方法在Activity的窗口焦点发生变化时调用,具体可以分为窗口获得焦点时和窗口失去焦点时。Activity的焦点发生变化时,相关的视图层次结构已经完成了测量,布局和绘制。

  • 获得焦点:当Activity的窗口从后台回到前台,或者从其他窗口中恢复。当获得焦点时,hasFocus传入true。
  • 失去焦点:当Activity的窗口被其他的窗口覆盖,或者用户按下home键使应用进入后台。当失去焦点时,hasFocus传入false。

(2)调用View的post(Runnable action)方法,在run方法中获取控件的宽高

  View的绘制过程包括onMesure(测量控件的宽高),onLayout(布局),onDraw(绘制)。post方法确保了所传递的Runnable对象会在视图树的测量,布局和绘制完成之后才运行,所以测试可以获取到控件的宽和高。

(3)观察者模式,给ViewTreeObserver添加监听器,在重写的方法onGlobalLayout()中获取控件的宽高

  ViewTreeObserver是一个监听视图树整体变化的类,它可以观察到视图树的各种全局事件。通过ViewTreeObserver,我们可以在视图树的布局过程完成之后获取到控件的宽高信息。

class MainActivity : AppCompatActivity() {
    private lateinit var tv: TextView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tv=findViewById(R.id.tv)
        tv.post(object:Runnable{//第一种方式
            override fun run() {
                val width=tv.width
                val height=tv.height
                Log.i("post","width=${width},height=${height}")
            }

        })
        tv.viewTreeObserver.addOnGlobalLayoutListener(object:ViewTreeObserver.OnGlobalLayoutListener{//第二种方式
            override fun onGlobalLayout() {
                val width=tv.width
                val height=tv.height
                Log.i("viewTreeObserver","width=${width},height=${height}")
            }
        })
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {//第三种方式
        super.onWindowFocusChanged(hasFocus)
        val width=tv.width
        val height=tv.height
        Log.i("onWindowFocusChanged","width=${width},height=${height}")
    }
}

 

  

标签:控件,val,tv,宽高,height,width,Activity
From: https://www.cnblogs.com/luqman/p/18429643

相关文章

  • C#在Winform中截图指定控件中的内容生成图像
    开发上位机过程中,收到需求:在软件跑完数据之后保存报告和图表截图。因为界面控件都做了大小拉伸缩放的适配,所以简单的设置截图起始点和长宽时无法满足需求的。所以要做一个根据控件本身大小来做截取动作的功能,所以我写了一个截取指定控件内图像的函数。 函数如下,只需传入控件,和存......
  • MFC 之 Progress Control 控件的使用
    提到ProgressControl控件,大家可能会觉得在UI界面里面装一个进度条控件,一下就会让UI界面变得高级了些,所以可能会认为这个控件可能比较难搞。其实恰恰相反,这个控件使用起来特别容易,调用方法也就寥寥几个。不过本文重点内容并不是讲ProgressControl的使用,而是会重点介绍一......
  • DragDrop.DoDragDrop(DependencyObject, Object, DragDropEffects) 方法——控件拖动
    参数dragSourceDependencyObject对依赖项对象的引用(该对象是被拖动数据的源)。dataObject包含被拖动数据的数据对象。allowedEffectsDragDropEffectsDragDropEffects 值中的一个,指定拖放操作的允许效果。返回DragDropEffectsDragDropEffects 值中的一个,指定在拖......
  • 报表控件DevExpress Reports v24.1 —— 拥有可调整布局选项
    DevExpressReports提供了一个可调整的布局选项,允许您以最合适的方式安排、塑造和组织数据。其中一个这样的数据塑造选项是分组,可以在表报告的详细信息带内将数据安排在嵌套的多字段组中。在v24.1版本周期中引入了几个函数,它们允许您获取不同组元素的索引,这些新功能包括:CurrentR......
  • C#控件开发能够阅读的书籍
    在C#中开发控件通常涉及到继承自现有控件类,并重写相关方法。以下是一些书籍,它们涵盖了C#控件开发的基础知识和高级主题:ProfessionalC#:WindowsFormsControlDevelopment作者:ChristianNagel出版社:Wrox推荐理由:这本书由ChristianNagel所著,是一本经典的C#WindowsForms控件......
  • 一组.NET MAUI绘制的开源控件 - AlohaKit
    前言今天大姚给大家分享一组.NETMAUI绘制的开源、免费(MITLicense)UI控件库:AlohaKit。MAUI介绍.NETMAUI是一个开源、免费(MITLicense)的跨平台框架(支持Android、iOS、macOS和Windows多平台运行),是Xamarin.Forms的进化版,从移动场景扩展到了桌面场景,并从头重新生成了UI控件,以提......
  • 一组.NET MAUI绘制的开源控件 - AlohaKit
    前言今天大姚给大家分享一组.NETMAUI绘制的开源、免费(MITLicense)UI控件库:AlohaKit。MAUI介绍.NETMAUI是一个开源、免费(MITLicense)的跨平台框架(支持Android、iOS、macOS和Windows多平台运行),是Xamarin.Forms的进化版,从移动场景扩展到了桌面场景,并从头重新生成了UI控件,......
  • WPF 控件模板ControlTemplate
    <Button><Button.Template><ControlTemplate><Grid><EllipseName="faceEllipse"Width="{TemplateBindingButton.Width}"Height=&qu......
  • 安卓Activity
    启动活动页面Activity的启动和结束从当前页面跳转到新页面,跳转代码如下:startActivity(newIntent(源页面.this,目标页面.class);从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:finish();//结束当前活动页面代码示例创建两个页面然后进行页面的跳转,首先创建......
  • 界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等
    TelerikUIforWinForms拥有适用WindowsForms的110多个令人惊叹的UI控件。所有的UIforWinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。本文将介绍界面组件TelerikUIforWinForms在今年第一个重大版本2024......