首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android view getWidth()即使在onPreDraw()中也会返回0

在Android开发中,View是用户界面的基本构建块之一。getWidth()是View类的一个方法,用于获取View的宽度。然而,当在onPreDraw()方法中调用getWidth()时,有时会返回0的情况。

这是因为在onPreDraw()方法中,View的绘制尚未完成,因此它的宽度还没有被计算出来。在这个阶段,View的宽度可能还没有被测量或布局,所以getWidth()返回0是正常的。

为了解决这个问题,可以使用ViewTreeObserver来监听View的绘制事件,并在绘制完成后获取宽度。具体步骤如下:

  1. 获取View的ViewTreeObserver对象:
代码语言:txt
复制
ViewTreeObserver observer = view.getViewTreeObserver();
  1. 注册一个OnPreDrawListener监听器:
代码语言:txt
复制
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
        // 在这里获取View的宽度
        int width = view.getWidth();
        
        // 执行你的逻辑操作
        
        // 返回true表示绘制完成,返回false表示继续等待绘制
        return true;
    }
});

通过这种方式,在onPreDraw()方法中获取getWidth()将会得到正确的宽度值。

至于Android开发中的其他相关概念和技术,例如前端开发、后端开发、软件测试、数据库、服务器运维、云原生、网络通信、网络安全、音视频、多媒体处理、人工智能、物联网、移动开发、存储、区块链、元宇宙等,每个领域都有其独特的概念和应用场景。

如果您对这些领域中的任何特定概念或技术有疑问,我可以为您提供更详细的解答和相关的腾讯云产品介绍链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

手撸一个物体下落的控件,实现雪花飘落效果

这样物体会从不同的位置下落,相同速度的情况下,能在不同的时间进入屏幕。   ...然后是X轴,正常的雪花肯定不是竖直下落,不是折线下落,而是弧形,View采用的sin函数的-Pi到Pi之间的值绘制弧形。x轴的初始位置通过对屏幕宽度做随机值确定。   ...绘制图片并且控制其大小   绘制图片在View是有提供方法的:canvas.drawBitmap(bitmap,presentX,presentY,null);从方法可以看到,我们需要的是bitmap...源码: 画布View: package com.wusy.wusylibrary.view.FallingView; import android.content.Context; import android.graphics.Canvas...; import android.util.AttributeSet; import android.view.View; import android.view.ViewTreeObserver;

1.3K30
  • Android 12 SplashScreen API快速入门

    何时会显示SplashScreen 注意,SplashScreenAndroid 12上是强制的,即使你什么都不做,你的AppAndroid 12上自动拥有SplashScreen界面。...return false } }) } } 这里我们回调函数onPreDraw()返回了一个false,也就意味着,我们的PreDraw阶段始终没有准备好...比如刚才提到的从磁盘读取数据的场景,我们可以一开始onPreDraw()函数返回false,然后开启子线程去读取数据,等到数据读取完成再将返回值改成true即可。...isReady = true } } } 注意,SplashScreen的显示过程onPreDraw()函数是以很高的频率持续刷新的。...所以它依然会将主线程阻塞住,导致应用程序无法响应用户的输入事件,直到我们onPreDraw()函数返回true才会停止刷新。

    2K10

    最简单最难——怎样获取到Android控件的高度「建议收藏」

    事实上是并没有简单的,不信的话,你能够去试一下,onCreate里面,你是无法获得长宽值的,始终为0。 原因 这是为什么呢,事实上熟悉view绘制流程的朋友应该一眼就看出来了。onCreate。...我们的控件事实上还并没有画好,换句话说,等onCreate方法运行完了,我们定义的控件才会被度量(measure),所以我们onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是...解决 No1: 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...如今看来,看似简单问题不是那么简单吧。 以上。

    82410

    android如何获取view布局的高度与宽度详解

    前言 可能很多情况下,我们都会有activity获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻。。...当我们 onCreate() 方法获取某个 View 组件的宽度和高度,直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight...public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); view.getWidth...对象的方法会在 View 的 measure、layout 等事件完成后触发。...UI 事件队列按顺序处理事件, setContentView() 被调用后,事件队列中会包含一个要求重新 layout 的 message,所以任何 post 到队列的 Runnable 对象都会在

    6K10

    Android自定义View——从零开始实现雪花飘落效果

    在上述代码View基本的框架我们已经搭好了,思路其实很简单,我们需要做仅仅是每次重绘之前更新做下落运动的物体的位置即可 封装下落物体对象 相关博文链接 Android开发无处不在的设计模式——Builder...模式:http://blog.csdn.net/sbsujjbcy/article/details/49208969 [Android] 获取View的宽度和高度:http://www.jianshu.com.../p/d18f0c96acb8 要实现大雪纷飞的效果,很明显只有一个雪球是不够的,而且雪不能只有雪球一个形状,我们希望可以自定义雪的样式,甚至不局限于下雪,还可以下雨、下金币等等,因此我们要对下落的物体进行封装...0, oldW, oldH, matrix, true); return bitmap; } Activity初始化下落物体样式时我们就可以导入drawable资源和设置物体大小了(图片资源我是阿里图标库下载的...扩展二:实现雪花“大小不一”、“快慢有别”的效果 之前我们通过导入drawable资源的方法让屏幕“下起了雪花”,但雪花个个都一样大小,下落速度都完全一致,这显得十分的单调,看起来一点不像现实的下雪场景

    1.7K20

    Activity 切换动画---点击哪里从哪放大

    效果图.gif 这次要实现的动画效果就是类似于上图那样,点击某个 view,就从那个 view 展开下个 Activity,Activity 退出时原路返回,即缩放到点击的那个 view。...总之,我对这个接触不多,这里就大概概括一下使用的一些步骤: 需要对共享的元素设置 transitionName, xml 设置 android:transitionName 或代码里调用 View.setTransitionName...也就是说,放大动画开始时,新 Activity 是从点击 View 的宽高作为起始放大至全屏,返回时从全屏缩小至点击 View 的宽高。...这样做的好处是,动画执行过程,如果网络或本地数据已经回调,通知 adapter 去刷新 view 时,这样导致动画很卡顿。...设置了 android:windowIsTranslucent=true 时,有的盒子界面就会是透明的,即使你设置了一张不透明的背景图,但透明度不会很明显。

    3.9K50

    2014-11-3Android学习------关于ViewPager的实现步骤--------GIF动画实现

    id 3.定义一个适配器,主要的工作就是将数据显示ViewPager上,思路类似于ListView需要一个Adapter 4.布局文件对应的activity类先定义必要的变量 5.对ViewPager...接下来我们一步一步的去实现这个翻页的效果: 1.确定依赖包的存在: 2.XML文件定义ViewPager <?xml version="1.0" encoding="utf-8"?....view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; public class...0); return views.get(arg1); } 4)返回页卡的数量 @Override public int getCount() { // TODO Auto-generated...== (arg1); } 4.实现该布局文件的activity类定义必要的变量 这里的变量就非常的多了,我们一个一个来说了 1)必须要构造出视图的集合,也就是一个个视图,填充ViewPager

    29020

    Android自定义View实现旋转的圆形图片

    自定义Viewandroid开发的一个重要技能,用android提供的2/3D绘制相关类可以实现非常多炫酷的效果,需要实打实的编程基础。...自定义View分四步。 一:自定义属性; 二:创建自定义View构造方法拿到自定义属性; 三:重写onMeasure方法; 四:重写onDraw方法 先来个效果图 ?...因为我测试的时候发现 假如我用这个image直接把Bitmap.createScaledBitmap(image,xx,xx,false);的返回值赋给image的话,即使我在这行代码前去用image.getWidth...0, bitmapPaint);//绘制图片,(图片会被旋转) bitmapPaint.setXfermode(null); return bitmap;//这个bitmap画布中被旋转...</RelativeLayout activity拿到控件,重写两个按钮的点击事件方法: private RotateCircleImageView rcv; ........onCreate

    1.6K60

    Android自定义ViewgetWidth()、getMeasuredWidth()获取宽高有什么区别?

    前言 自定义View的过程,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View的宽 / 高,但是二者有什么区别呢...() / getMeasuredHeight()返回值 1.1 结论 返回的值是 ViewMeasure过程测量的宽 / 高 1.2 源码分析 由于getMeasuredWidth()与getMeasuredHeight...View的宽/高值 return result; } 2. getWidth() / getHeight()返回值 2.1 结论 返回的值是 ViewLayout...应用场景 getMeasuredWidth() / getMeasuredHeight()是Measure过程赋值的,所以需Measure过程后获取的值才有意义 同理,getWidth() / getHeight...获取View的宽/高 getWidth() / getHeight():除onLayout()外的地方获取View的宽/高 4.

    1.6K41

    安卓 View 和常见控件

    自定义 listview 的 item 的布局的时候, 通常加上最小高度的属性, 防止高度过小导致用户点击不到。 android:minHeight="?...getText 不为null, 然后得到的是空字符串 "", 然后长度为0 EditText 主题一般自带背景,如果需要去掉的话, android:background="@null" Android...根据不同的情况R.color.blue可以是R.string.blue或者 //另外还可以使用系统自带的颜色类 setTextColor(android.graphics.Color.BLUE);...getWidth()和getMeasuredWidth()之间的区别 getMeasuredWidth()获取的是 view 原始的大小,也就是这个 view XML文件配置或者是代码设置的大小...getWidth()获取的是这个 view 最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小。

    97910

    android viewpager实现竖直滑动效果

    做过android开发的朋友们,一定知道viewpager是什么,但是viewpager只能水平滑动。现在有的项目引导页开始使用竖直滑动,这个时候viewpager就不能帮到我们了,怎么办?...首先新建一个android项目叫:Customviewpager 我们知道viewpager也是继承了ViewGroup类的,在这里我们写一个CustomViewPager类继承了ViewGroup...i<getChildCount();i++){ View childView = getChildAt(i); // childView.layout(i*getWidth(), 0, (i+1)*getWidth...(), getHeight());、//这是水平方向滑动 childView.layout(0, i*getHeight(), getWidth(), (i+1)*getHeight());//这是竖直方向滑动...返回false表示传递给子view,而当前这个父view就不再持有这个滑动事件了,想很好了解这个问题,就设计到view事件传递了,大家可以通过down,move,up下返回不同的值,打log去分析原理

    1.5K30

    Andrid自定义view:打造3D画廊

    昨日朋友给我看了下这样的效果,我觉得很有意思,今日闲下来便写了这篇文章,并且传到了github,本文的末尾附上了链接。...,并返回一个继承自Object的key,这个key将会在第三个方法destroyItem和第四个方法isViewFromObject作为参数调用。   ...view, Object object)   确定instantiateItem返回的特定key 对象是否与page View有关联。...由于instantiateItem可以以自身page为key返回,所以在这里就可以这样写: @Override public boolean isViewFromObject...position的取值有如下说明: position是指的是页面相对于中间页面的位置参数,根据位置不同,0的时候中间最前面,1的时候页面完全右边,-1的时候页面完全左边。

    64520

    Android自定义View:源码解析通过getWidth() 与 getMeasuredWidth()获取宽高的区别

    前言 自定义View的过程,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View的宽 / 高,但是二者有什么区别呢...---- 1. getMeasuredWidth() / getMeasuredHeight()返回值 1.1 结论 返回的值是 ViewMeasure过程测量的宽 / 高 1.2 源码分析 由于getMeasuredWidth...View的宽/高值 return result; } ---- 2. getWidth() / getHeight()返回值 2.1 结论 返回的值是 ViewLayout...应用场景 getMeasuredWidth() / getMeasuredHeight()是Measure过程赋值的,所以需Measure过程后获取的值才有意义 同理,getWidth() / getHeight...获取View的宽/高 getWidth() / getHeight():除onLayout()外的地方获取View的宽/高 ---- 4.

    1.8K20
    领券