Android 获取View的高度和宽度

从ISO 17987到SAE J2602:LIN一致性测试标准全景解读与CANoe实现 本文深入解析了从ISO 17987到SAE J2602的LIN一致性测试标准技术演进,详细对比了两大标准体系的技术差异,并基于Vector CANoe平台演示了如何构建符合最新行业要求的自动化测试方案。文章重点介绍了SAE J2602标准的三大改进点,包括唤醒特性、传输层协议和诊断服务的增强测试要求,并提供了CANoe测试环境配置、测试模块集成及测试案例解析的实战指南。 阅读详情

##View宽高值为什么是0
如果我们想获取View的高度和宽度,通过在onCreate()或者onStart()或者onResume()等生命周期中直接获取,像下面这样处理会获取到View的高度吗?

package com.wjj.imagepull;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity
{
    ScrollView scrollView;
    public static final String TAG = "VIEW_PARAM";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        scrollView = (ScrollView) findViewById(R.id.scroll_view);

        getHeightAndWidth("onCreate()");
    }

    private void getHeightAndWidth(String method)
    {
        int height = 0;
        int width = 0;

        if (scrollView != null)
        {
            height = scrollView.getHeight();
            width = scrollView.getWidth();
        }

        Log.i(MainActivity.TAG, method + " has been called: " + System.currentTimeMillis() + " height: " + height + " width: " + width);
    }

    @Override
    protected void onStart()
    {
        super.onStart();

        getHeightAndWidth("onStart()");
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        getHeightAndWidth("onResume()");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings)
        {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

接下来在自定义的组件PullScrollView中适当的方法中加入一些测试log:

public class PullScrollView extends ScrollView
{

    View view;
    int sacTopMargin;
    float lastY;
    float offsetY;

    public PullScrollView(Context context, AttributeSet attrs)
    {
        super(context, attrs); 
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        Log.i(MainActivity.TAG, "onMeasure() has been called: " + System.currentTimeMillis());
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        Log.i(MainActivity.TAG, "onDraw() has been called: " + System.currentTimeMillis());
    }
    ...
}

然后运行后看一下Log
此处输入图片的描述

通过上面的方法,显然不能获取到View的高度和宽度,关于为什么获取不到View的这些参数值,原因很简单,因为当前Activity中持有的WindowPhone实例还尚未将View添加到DecorView上来,所以无法获取View的高度和宽度,一般在onResume生命周期过后300ms左右时间才会将需要显示的View添加到DecorView上去,代码像下面这样处理:

##如何获取View宽高值

@Override
protected void onResume()
{
    super.onResume();

    getHeightAndWidth("onResume()");

    scrollView.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            getHeightAndWidth("onResume()_postDelayed()");
        }
    }, 300);
}

此处输入图片的描述
这样就获取了View的宽高值,当然这个方法不太保险,因为你不能确保在onResume之后300ms 就能将View添加到DecorView中去,那么保险的方式是什么呢?相信读过Android源代码的同学对ViewTreeObserver.OnGlobalLayoutListener并不陌生,当一个view的布局加载完成或者布局发生改变时OnGlobalLayoutListener可以监听到,利用这点我们可以在布局加载完成的瞬间获得一个view的宽高。

public class PullScrollView extends ScrollView implements ViewTreeObserver.OnGlobalLayoutListener
{
    public PullScrollView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        ViewTreeObserver observer = getViewTreeObserver();
        if (null != observer)
            observer.addOnGlobalLayoutListener(this);
    }
    
    @Override
    public void onGlobalLayout()
    {
        MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
        sacTopMargin = -params.topMargin;
        Log.d(MainActivity.TAG, "" + sacTopMargin);
        getViewTreeObserver()
                .removeGlobalOnLayoutListener(this);
    }
    ...
}

OnGlobalLayoutListener的onGlobalLayout被回调之前是没有值的。由于布局状态可能会发生多次改变,因此OnGlobalLayoutListener的onGlobalLayout可能被回调多次,所以我们在 第一次获得值之后就将listener注销掉。

当然关于如何获取View的高度和宽度值,还有很多方法,这里仅仅测试了两种比较靠谱的方法,感兴趣的同学可以继续深究。

肿瘤基因组分析实战:VAF、MAF、CCF这些指标到底怎么算?(附Python代码示例) 本文通过Python代码示例,详细解析了肿瘤基因组分析中VAF、MAF和CCF三大核心指标的计算逻辑与应用。文章从VCF文件解析入手,逐步演示了变异等位基因频率、次等位基因频率及癌细胞分数的计算方法,并探讨了拷贝数变异对结果的影响及克隆结构推断的实战流程,为生物信息分析提供实用指南。 阅读详情

相关推荐

四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

移位寄存器有哪些分类呢? 按移位方向分类:①单向移位寄存器(包括左移、右移)②双向移位寄存器 按循环方式分类:①循环移位寄存器②非循环移位寄存器 按部位的不同分类:①逻辑移位寄存器②算术移位寄存器 按输入输出方式分类:①串入串出②串入并出③并入串出④并入并出

Loudrs的博客 1万+

android ScrollView高度

在ScrollView完全显示之前,使用ScrollView的getHeight获取d

dongzibin的专栏 3844

逆向选择启示录:一个失败高频策略如何意外跑赢市场

本文探讨了高频交易中的逆向选择现象,揭示了一个失败的高频策略如何通过简化意外跑赢市场。通过加密货币市场的实证分析和蒙特卡洛模拟,研究发现低预测性的简单策略反而更具鲁棒性,有效规避了逆向选择风险。文章还提供了小币种做市策略的优化框架和实践建议,为量化交易者提供了宝贵洞见。

weixin_29191669的博客 401

Android开发:PopupWindow中ScrollView设置最大高度问题

目的是实现LinearLayout中的内容通过代码动态添加,当内容较少时,ScrollView适应内容高度,当内容较多时,ScrollView保持固定高度并显示滚动条。

wsfsp_4的博客 2202

解决ublox无法定位问题(一直输出$GxTXT)

最近开始研究有关RTK技术的项目,于是先购买了两块ublox公司的NEO-M8T-0型号芯片。(注意NEO-M8T还细分为NEO-M8T-0和NEO-M8T-2,前者不支持RTCM输出,后者支持RTCM输出) 首先都是按常规步骤,直接把芯片模块串口接电脑调试,这边推荐是用官网的u-center调试软件。GPS芯片大多数都是上电后串口自动发送定位等信息,这两块芯片有一块正常情...

众缈之门的博客 7359

具身智能:原理、算法与系统 第3章 具身智能的感知-认知-行为框架

具身智能的PCB框架源于对生物智能系统的观察:动物通过感官接收环境信息(感知),基于内部模型进行预测和决策(认知),并通过身体执行动作改变环境(行为),而这一改变又通过感知反馈形成闭环。这一框架在两篇核心文献中得到了深入阐述:提出了系统的数学形式化和工程实现,则从认知科学角度强调了归纳偏置和双过程理论的重要性。

VectorShift的博客 155

android 获取scrollview高度,Android中ScrollView实现滑动距离监听器的方法

前言众所周知ScrollView是我们经常使用的一个UI控件,也许你在使用ScrollView的过程中会发现,当你想监听ScrollView滑动的距离时却没有合适的监听器!当然在API 23中有setOnScrollChangeListener(View.OnScrollChangeListener l)可以使用,但是并不兼容低版本的API。那怎么办呢?只好重写ScrollView来实现对滑动距离...

weixin_30748871的博客 1437

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 620

获取webview的高度

- (void)webViewDidFinishLoad:(UIWebView *)webViewer{ CGFloat webViewHeight = [[webViewer stringByEvaluatingJavaScriptFromString:@"document.height"]floatValue]; } - (void)webViewDidFinishLoad:

Richer1997的专栏 605

台区同期线损智能诊断与闭环治理体系及工程化实践

高损台区:同期线损率>预设阈值(通常为8%,可根据区域、台区类型调整);负损台区:同期线损率<0,即供电量小于售电量,多由档案、计量、拓扑错误导致;波动损台区:月度线损率波动幅度>预设阈值(通常为5%),且无合理原因;持续异常台区:连续2个及以上周期线损率不达标,且未完成有效整改。台区同期线损智能诊断与闭环治理体系,以电力大数据为基础、智能诊断模型为核心、标准化流程为保障,彻底解决了传统线损治理“异常发现慢、定位难、整改乱、无闭环”的痛点,实现了线损治理从“人工经验驱动”向“数据智能驱动”的根本性转型。

getusushu的博客 204

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 172

android view的隐藏和显示_Android如何获取WebView内容高度

作者:zhuguohui地址:https://www.jianshu.com/p/ad22b2649fba最近项目需求中需要实现WebView显示内容,下方显示评论列表,列表还可以分页加载。我最近做了技术预研,难度主要是实时获取WebView的高度。效果1 . 分页加载2 . 动态获取高度,点击阅读更多,会将几个隐藏的div,显示出来,造成WebView内容高度变化。##实现 使用的S...

weixin_39872893的博客 444

058、时域降噪(Temporal Denoise):运动补偿与递归滤波在视频降噪中的应用

本文深入探讨了时域降噪(Temporal Denoise)技术在视频处理中的应用。作者通过车载环视项目案例,揭示了空域降噪的局限性,提出利用帧间信息进行降噪的核心思路。文章详细解析了递归滤波和运动补偿两大关键技术,指出递归滤波简单但易产生拖影,而运动补偿通过计算运动矢量解决此问题。作者还分享了多帧降噪方案的优势与算力挑战,并总结了噪声模型匹配、运动矢量一致性等实战调优经验。最后强调时域降噪需要与空域降噪平衡,指出调试工具的重要性,提出"在保证运动区域无鬼影的前提下追求信噪比"的实践原则,体现了算法复杂度与效

zzfmlxs的博客 92

Android获取View的宽度和高度

前言:可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻。。然后立马写下getWidth()、getHeight()等方法,洋洋得意的就走了。然而事实就是这样的吗?实践证明,我们这样是获取不到View的宽度和高度大小的,可能很多同学又会纳闷了,这是为什么呢?一直不都是这样获取大小的嘛!疑问解

白哥哥的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[Android] 获取View的宽度和高度

有时需要在 onCreate() 方法中获取某个 View 组件的宽度和高度,而直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight() 方法只会得到 0。 实现方法 一、使用 View.measure 测量 View 该方法测量的宽度和高度可能与视图绘制完成后的真实的宽度和高度不一致。 int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIF

wddptwd28的博客 841

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android 开发 Activity里获取View的宽度和高度 转载

原文地址:https://blog.youkuaiyun.com/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻。。然后立马写下getWidth()、getHeight()等方法,洋洋得意的就走了。然而事实就是这样的吗...

cherish152的博客 91

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 获取一个view的高度,Android获取View的实际宽度和高度

前言:代码很简单,网上资料很多,此篇只是做记录用。ViewTreeObserverViewTreeObserver vto = mRootView.getViewTreeObserver();vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlob...

weixin_31207903的博客 394

android中获取view在布局中的高度和宽度

有时需要在 onCreate() 方法中获取某个 View 组件的宽度和高度,而直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight() 方法只会得到 0。 实现方法 一、使用 View.measure 测量 View 该方法测量的宽度和高度可能与视图绘制完成后的真实的宽度和高度不一致。 int width = View.

想飞的企鹅 4902

Android获取View的实际宽度和高度

前言:代码很简单,网上资料很多,此篇只是做记录用。 ViewTreeObserver ViewTreeObserver vto = mRootView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @...

qq_36356379的博客 3029

Android - 在View显示前获取其高度和宽度

Android开发经常需要在Activity显示前获取某个View的高度和宽度,例如:程序需要在onCreate()方法中得到一个View的高度和宽度,或者需要知道一个Visibility为Gone的View的高度和宽度。此时如果直接调用View的getWidth()和getHeight()方法,得到的结果是0。 原因是在上述情况中,View并没有实际绘制,既然原因找到了,解决办法也就有了,我们可...

weixin_30483013的博客 316

Android中自定义控件-获取View的宽度和高度

在漫长的开发岁月中,你有没有遇到过这种问题,我们对一个布局高度设置了wrap_contant属性,但是在某个地方我们需要获取到它的一个真实的高度,那我们该怎么办呢?这里提供了一种获取某个View高度的方法。 public static float getRealHeight(View child){ LinearLayout llayout = (LinearLayout) child...

水月洞天 1882

android activity view 获取高度,Android 开发 Activity里获取View的宽度和高度 转载

前言:可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻。。然后立马写下getWidth()、getHeight()等方法,洋洋得意的就走了。然而事实就是这样的吗?实践证明,我们这样是获取不到View的宽度和高度大小的,可能很多同学又会纳闷了,这是为什么呢?一直不都是这样获取大小的嘛!疑问...

weixin_36369656的博客 398

android 获取一个view的高度,android-以编程方式获取布局的高度和宽度

android-以编程方式获取布局的高度和宽度我设计了一个布局,其中LinearLayout有2个孩子-2和-1,并且在每个孩子中我放置不同的视图。我只想测量-2的高度和宽度,以便可以实现自己的目的。在程序中我正在使用int height,width;FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);height=fr.getHeight();wi...

weixin_39795971的博客 563

java获取屏幕宽度和高度_Android获取屏幕或View宽度和高度的方法

本文实例讲述了Android获取屏幕或View宽度和高度的方法。分享给大家供大家参考,具体如下:在Activity中获取屏幕的高度和宽度Display display=getWindowManager().getDefaultDisplay();int width=display.getWidth();int height=display.getHeight();在重写ViewGroup中获取屏幕...

weixin_28762271的博客 211

android 获取屏幕或View的宽度和高度

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34407348的博客 118

android获取一个view的高度,Android应用开发之Android 获取View高度宽度

本文将带你了解Android应用开发之Android 获取View高度宽度,希望本文对大家学Android有所帮助。Android 获取View高度宽度等待View加载完成Java代码 finalImageViewiv=(ImageView)findViewById(R.id.iv_test);iv.setImageResource(R.drawable.a...

weixin_30072631的博客 283
上一篇: Java 并发编程框架(一)
下一篇: Android 坐标常识
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值