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

Android Design:在invalidate()之后未调用onDraw()

Android Design是一种用于创建美观和用户友好的Android应用程序的设计原则和指南。在Android应用程序中,invalidate()方法用于标记视图无效,以便在下一次绘制周期中重新绘制视图。但是,在调用invalidate()之后,系统不会立即调用onDraw()方法来重新绘制视图,而是在下一个绘制周期中自动调用。

在调用invalidate()之后未调用onDraw()的情况下,可能有以下几种原因:

  1. 视图层级不可见:如果视图所在的层级在调用invalidate()后变为不可见状态(例如,被其他视图遮挡或隐藏),则系统不会调用onDraw()方法。
  2. 无效的布局参数:如果视图的布局参数无效,例如宽度或高度为0,那么系统将不会调用onDraw()方法。
  3. 未正确重写onDraw()方法:如果视图的onDraw()方法未正确重写或存在错误,系统将不会调用该方法。确保正确实现onDraw()方法,并在其中执行所需的绘制操作。

解决此问题的方法包括:

  1. 检查视图的可见性:确保视图所在的层级在调用invalidate()后仍然可见。
  2. 检查布局参数:确保视图的布局参数有效,并且视图具有适当的宽度和高度。
  3. 检查onDraw()方法:确保正确重写onDraw()方法,并在其中执行所需的绘制操作。

在腾讯云的产品中,与Android Design相关的产品包括:

  1. 腾讯移动分析(https://cloud.tencent.com/product/ma):用于分析和监控移动应用程序的用户行为和性能,帮助开发者优化应用程序的设计和用户体验。
  2. 腾讯移动推送(https://cloud.tencent.com/product/tpns):提供消息推送服务,帮助开发者向Android设备发送定制化的通知消息,提升应用的用户参与度。

请注意,以上仅为示例产品,实际使用时应根据具体需求选择适合的腾讯云产品。

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

相关·内容

android onresume函数,androidActivity中重新创建后调用onResume

应用程序设置中进行某些更改时,我recreate的onActivityResult中调用MainActivity。重新创建后,不调用onResume。...我也收到错误:E/ActivityThread: Performing pause of activity that is not resumed 从this问题开始,我了解到不能从onResume调用此函数...另外,使用处理程序来调用recreate可以解决问题,但会导致眨眼,对用户而言很糟糕。这可能是什么错误?没有recreate的情况下如何使用Handler? 任何想法将不胜感激。谢谢!...最佳答案 onResume()之前调用OnActivityResult()。...您可以做的是OnActivityResult()中设置一个标志,您可以onResume()中检入,如果该标志为true,则可以重新创建活动。

3.3K20

android开关按钮

"       反之就是选中off情况下的效果:android:drawable="@drawable/ios7_switch_off" 之后布局文件中写控件: <ToggleButton android...可以查看官方文档,之后继承CompuundButton,布局的动画和显示上调用onDraw(Canvas canvas)重画既可以,如果想要加入拖动属性,那么该VIEW内重写触摸事件onTouchEvent...注意:由于状态切换等,enabled属性改变等,是你自定义的方法内的话,你必须自己去调用invalidate();方法,去让UI判断是否有更改并做出相应的变化。...UI是否需要变化,之后UI方法onDraw(Canvas canvas)中调用android.graphics.Canvas.saveLayerAlpha(RectF bounds, int alpha...由于目前对于重写VIEW的onDraw方法的了解不是很深入,所以这里的DEMO中的几个方法都是查看网络之后加上自己的优化和注释演变过来,等这一块深入了后重写写一篇关于这个的感受和使用说明。

4K80

SwitchButton 开关按钮 的多种实现方式

"       反之就是选中off情况下的效果:android:drawable="@drawable/ios7_switch_off" 之后布局文件中写控件: <ToggleButton android...可以查看官方文档,之后继承CompuundButton,布局的动画和显示上调用onDraw(Canvas canvas)重画既可以,如果想要加入拖动属性,那么该VIEW内重写触摸事件onTouchEvent...注意:由于状态切换等,enabled属性改变等,是你自定义的方法内的话,你必须自己去调用invalidate();方法,去让UI判断是否有更改并做出相应的变化。...UI是否需要变化,之后UI方法onDraw(Canvas canvas)中调用android.graphics.Canvas.saveLayerAlpha(RectF bounds, int alpha...由于目前对于重写VIEW的onDraw方法的了解不是很深入,所以这里的DEMO中的几个方法都是查看网络之后加上自己的优化和注释演变过来,等这一块深入了后重写写一篇关于这个的感受和使用说明。

3K70

手撕一个让人「欲罢不能」的水波纹选中控件

一、前言 Android 5.0 以后,随着 Material Design 的提出,Android UI 设计语言可谓是提升了一大步,但是国内其实并没有得到很大的推广应用。... startScroll 后,调用invalidate() 这个方法,我们知道,调用这个方法以后,系统会触发 View的 draw 流程。...updateChangingArgs 的最后,又调用invalidate ,这就实现了一个死循环刷新 即: invalidate->draw(onDraw/dispatchDraw)->computeScroll...可以有两个选择,一个是 onDraw 方法中绘制,一个是 dispatchDraw 中绘制。...如果选择 onDraw 的话,要构造函数中调用一下这个方法 setWillNotDraw(false),否则如果没有背景色的话,ViewGroup 是不会调用 onDraw 方法的。

1.1K40

虾扯蛋:Android View动画 Animation不完全解析

最主要的,提供方法供调用特定时间点获得动画执行的结果。 Animation、Scroller的这种设计思路Android UI框架中很有用,实现了数据、逻辑、执行过程独立封装。 1....使用-1这样的负数来表示特殊状态的用法已经很平常了,比如indexOf这样的方法,-1表示选择列表中任何一项等。...app中某个界面形成的ViewTree通过遍历每个View对象执行其draw方法(进而执行onDraw方法)来完成整个屏幕要绘制内容的计算,并且绘制的内容会被缓存,之后没有内容变化的情况下就向显示设备输出之前被缓存了的数据...不借助Animation所提供的API时,我们可以定义一个当前时间开始的300ms的倒计时,然后调用invalidate通知onDraw的执行,之后onDraw中根据是否过期来继续执行invalidate...此时,最终的onDraw的执行间隔依然是由系统决定的,我们只负责判断是否退出invalidate调用的“递归”(从某种形式上看是的)。后面可以看到Animation机制几乎就是类似的原理。

1.6K90

Android自定义支付密码输入框,光标问题总结!

image.png 本文主要分析自定义验证码输入框过程中常被忽视的光标问题及个人的一点经验总结 onDraw方法一直被调用 我们onDraw方法中添加Log日志,发现onDraw方法每间隔500ms...方法一直被调用 isCursorVisible = false 问题分析 问题1:是什么方法一直不停的调用onDraw方法呢?...我们知道invalidate方法会触发页面重绘进而调用onDraw方法,EditText又继承TextView,TextView源码中搜索invalidate关键字然后加断点调试运行,最后将代码锁定在...1了:是什么方法一直不停的调用onDraw方法呢?...答案1:invalidateCursorPath方法一直被调用,最后导致onDraw方法被调用 问题2:什么方法一直调用invalidateCursorPath方法呢?

1.3K20

Android模拟实现滑动解锁界面

本文实例为大家分享了Android模拟滑动解锁界面,供大家参考,具体内容如下 实现逻辑 自定义一个view继承view类,实现里面的方法 构造方法中加载出图片资源.onMeasure中获取背景的宽和高作为自定义控件的宽和高...onDraw方法中绘制出滑块,控件的布局文件中设置控件的背景图片 设置滑块的触摸事件,分别算出当手指按下屏幕.移动,离开屏幕时滑块的位置 移动的过程中,对滑块的位置进行限定,使滑块的位置不能超过指定的区域...以背景图片为标准 setMeasuredDimension(bgBitmap.getWidth(),bgBitmap.getHeight()); } @Override protected void onDraw...(Canvas canvas) { super.onDraw(canvas); //绘制图片 canvas.drawBitmap(slidBitmap,0,0,null); } //设置滑块的触摸事件...方法 调用invalidate之后调用draw draw会调用到这个computeScroll @Override public void computeScroll() { if (scroller.computeScrollOffset

1.9K30

2014-10-27Android学习------布局处理(七)------26个字母的布局列表的监听事件处理-----城市列表应用程序

屏幕中拖动:该方法还负责处理触控笔屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判 断动作值是否为MotionEvent.ACTION_MOVE再进行处理。...();//更新View,UI线程自身中使用 } } break; case MotionEvent.ACTION_MOVE://按下之后拖动事件 if (oldChoose !...那么我们来代码中加入输出日志 看看它是怎么执行的: 首先我贴上这个类的代码(加了输出跟踪日志): import android.content.Context; import android.graphics.Canvas...,接下来就去调用onTouchEvent()函数, 我们再来看看拖动事件的执行过程: 好了 时间有限 ,今天就写到这里,具体的原理下次有机会再讲了,这个类写好之后,我们以后需要用这样的一个widget...的时候,只需要导入这个类,然后layout里面定义如下即可使用: <com.wust.citylist.activity.MyLetterListView android

46830

自定义View学习——仿QQ消息气泡拖拽黏连删除

因为我发现这个QQ消息气泡开源控件是规则的圆,所以稍加修改,对onDraw()绘画图形做了变动,更加接近于QQ气泡了。...毕竟前人栽树后人乘凉,该控件又是通过手指触摸调用事件分发处理又是贝塞尔曲线的应用,多少目前能力有限,只有借鉴了。需要的文件图片请从文中提供的MessageBubbleView仿QQ消息控件下载。...参考博客:仿 QQ 读消息气泡,可拖拽删除,粘连效果 参考博客中的实现思路: 首先我们需要两个圆,一个是原点不需要跟随手指的圆,一个是跟随手指的圆,当用户开始点击时,绘制跟随手指的圆和圆上的读消息数量...注意:使用时需要在所有父布局中加入android:clipChildren="false"属性,使气泡可以父布局中拖动。...centerCircleY + centerRadius), centerRadius, centerRadius, mPaint); } //画数字(要在画完贝塞尔曲线之后绘制

1.4K30

Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

Android 7.0 之后的优化机制 三、 自定义布局渲染优化 一、 背景设置产生的过度绘制 ---- 1....Android 7.0 之后的优化机制 Android 7.0 之后的优化机制 : ① 7.0 系统优化前 : Android 7.0 之前调用 UI 组件的 invalidate 方法 , 组件会回调...onLayout , onMeasure 和 onDraw 方法 ; ② 7.0 系统优化后 : Android 7.0 之后调用 UI 组件的 invalidate 方法 , 组件不会回调 onLayout...和 onMeasure 方法 , 只会调用 onDraw 方法 ; ③ 7.0 系统优化后工作机制 : GPU 中缓存 UI 组件对应的多维向量图形 ( 纹理 ) , 当该组件位置或颜色等外观发生变化时...自定义组件过度绘制问题描述 : 自定义控件 , 自定义的 onDraw 方法中 , 绘制多张图片 , 如果图片之间产生重叠 , 重叠绘制的部分就出现了过度绘制 ; 2.

4.6K30

面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

fork() 之后,父进程和子进程将并发执行相同的代码。这意味着 fork() 系统调用在父进程和子进程中都会执行。fork() 的返回值规则是为了让父进程和子进程能够区分自己的角色。...invaliddate() 和 postInvalidate()这个两个方法的区别比较简单:postInvalidate() 就是子线程调用时,把操作 post 到主线程调用,最终还是走的 invalidate...: //调用invalidate()方法,打印如下MyView onDraw:requestLayout 和 invalidate 最终都会调用到 ViewRootImpl 的 scheduleTraversals...总结requestLayout()和invalidate()都是Android中用于更新视图的方法,它们的区别如下:requestLayout():当视图的布局参数(如宽度、高度、位置等)发生变化时,需要调用...创建之后,只需要保证创建 ViewRootImpl 的线程和更新 UI 的线程是同一个就可以;比如我们子线程调用 ViewManager#addView我们同上说子线程不可以更新 UI,这个异常是

25330

Android自定义圆形View实现小球跟随手指移动效果

实现的思路: 1)自定义View,onDraw中画圆作为小球; 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用新的坐标重新绘制小球; 3)布局中引用自定义View布局,运行程序...提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型: 1....Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。    invalidate()是用来刷新View的,必须是UI线程中进行工作。...比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。...invalidate()得UI线程中被调动,工作者线程中可以通过Handler来通 知UI线程进行界面更新。而postInvalidate()工作者线程中被调用

1.8K30

Android多点触控技术实战,自由地对图片进行缩放和移动

接着我们可以调用setImageBitmap()方法把要显示的图片对象传进去,这个方法会invalidate一下当前的View,因此onDraw()方法就会得到执行。...然后onDraw()方法里判断出当前的状态是初始化状态,所以就会调用initBitmap()方法进行初始化操作。...这里所有的偏移和缩放操作都是通过矩阵来完成的,我们把要缩放和偏移的值都存放在矩阵中,然后绘制图片的时候传入这个矩阵对象就可以了。 图片初始化完成之后,就可以对图片进行缩放处理了。...然后invalidate一下,就会在onDraw()方法中就会调用zoom()方法。...然后invalidate一下当前的view,又会进入到onDraw()方法中,这里判断出当前是移动状态,于是会调用move()方法。

2.2K50

Android开发实现各种图形绘制功能示例

true; } 其中touch_start,touch_move和touch_up函数分别处理按下,移动和抬起事件,函数的实现将在后面介绍,invalidate函数会调用onDraw函数保证绘图效果实时显示出来...(mRect1, Path.Direction.CW); break; } 根据mShape的值绘制不同的图形,为1时绘制Bezier曲线,为2时绘制直线,为3时绘制椭圆,为4是绘制矩形,分别调用...touch_up函数实现如下: mCanvas.drawPath(mPath,mPaint); mPath.reset(); 将Path绘制到Canvas的Bitmap里 最后OnDraw函数里需要把当前的...protectedvoid onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas)...更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android

46610

自定义View必备知识-View绘制流程

onDraw(Canvas canvas) onDraw绘制自己,新建一个paint canvas上绘制自己的图形 绘制children (dispatchDraw)dispatchDraw会遍历调用所有子元素的...而现在的Android手机几乎都没有键盘了,因此基本上只可以使用requestFocus()这个办法来让视图获得焦点了。...先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。...还需要尽可能的减少onDraw调用的次数,大多数时候导致onDraw都是因为调用invalidate().因此请尽量减少调用invaildate()的次数。...如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。

1.7K30

Android自己定义控件系列二:自己定义开关button(一)「建议收藏」

4、对于一个控件,须要显示,我们当然须要将它绘制出来,这里就须要重写onDraw方法,来将这个控件绘制出来 5、当控件状态改变的时候,我们非常可能须要刷新view的显示状态,这时候就须要调用invalidate...这种方法实际上会又一次调用onDraw方法来重绘控件 6、定义控件的过程中。假设须要对view设置点击事件。能够直接使用setOnClickListener方法。...并且,因为是继承自view控件,所以xml文件里假设是view本身的属性都能够直接使用,比方:android:layout_width等等 这里比較关键的地方就在于这个onDraw方法,我们一起来看一下...同一时候变化slideButton的值为0或者backgroundBitmap.getWidth()-slideButton.getWidth(),然后再调用invalidate()方法刷新控件,就能够实现主要的开关功能了...须要重绘view,那么调用invalidate();方法,这种方法实际上会又一次调用onDraw方法 * 7、在这当中。假设须要对view设置点击事件。

82020
领券