问题标签 [android-view-invalidate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
697 浏览

android - 更新 ListView 页脚

我有ListView一个页脚View,其中包含一个TextView可以根据所选语言动态更改的页脚。
当我选择不同的语言时,我会更新我的ListView项目:

基础适配器

为了更新我的页脚,我这样做了:

这不起作用,文本没有改变。但是,如果我将其替换为invalidate();

注意:我的ListView元素是TextViews根据所选语言翻译的,它们的数量也可以增加或减少。我的页脚永远不会改变,我只想要View更新以便翻译文本(选择正确的值-(lang)/strings.xml)。

我的问题是,为什么第一种方法不起作用?我能想到的唯一解释是invalidate();不会setText()再次调用,它只会重绘View. 它适用于,ListView因为适配器再次调用getView()再次TextViews填充的地方。这个假设正确吗?

谢谢。

0 投票
0 回答
496 浏览

android - 使画布无效,不重绘背景

所以我有一个扩展视图类的类,另一个从外部设备接收数据的类,当新数据进入一个标志时,我在我的视图上调用无效。问题是它重绘了整个画布(在父 draw() 方法中设置新背景),但我希望之前存在的数据保留在画布上,并在有更新时添加到其中。有没有办法将旧数据(线条、位图等)留在画布上,只更新其中的一部分(无需全部重绘——因为我想保持应用程序快速运行并最大限度地减少内存使用)?

0 投票
1 回答
300 浏览

android - 为什么部分无效跨越整个视图?

我正在尝试使 android 视图部分无效。我使用 View.invalidate( l, t, b, r ) 并且它似乎正确地使垂直(顶部和底部)值无效,但是,无论我使用哪个左右值,它都会使整个视图无效。

例如,我的视图是灰色的。我希望使绿色区域无效,但是,它使绿色和红色区域无效。它总是跨越整个视图的整个水平方向。我试图输入诸如 View.invalidate( 0, 0, 50, 50 ) 之类的小值,但它仍然会导致这种行为。

图片链接(没有足够的代表来发布图片)

为什么会这样?

0 投票
1 回答
4699 浏览

android - ListView invalidate() 与 invalidateViews() 之间的区别?

ListView.invalidate() 和 ListView.invalidateViews() 有什么区别?

对我来说,单独的 invalidate() 是行不通的。而 invalidateViews() 只是按照我想要的方式工作,即重绘列表项。

0 投票
1 回答
177 浏览

android - 在无效之间保持动画状态

我试图在无效后保存视图状态,但我非常不成功。

问题是我有一个图像,用户可以缩放(在右侧或左侧)。在他缩放它之后,应用程序将在某些位置上绘制点,并且在用户单击其中一些之后,我希望它改变(它是带有可选城市的地图)。

问题是,在单击该点后,我需要调用 invalidate() 以再次调用 onDraw() - 以更改该点,但在使地图失效后,它会恢复到其原始状态,因此它再次“未缩放”。您能否告诉我,如何通过 invalidate 方法保留应用于视图的动画状态?

0 投票
4 回答
11138 浏览

android - 为什么在失效后直接调用requestLayout

我正在学习自定义视图并想了解invalidate()requestLayout().

请参考这个答案及其图表:

https://stackoverflow.com/a/25846243/4243687

invalidate()告诉 Android 视图的状态发生了变化,需要重新绘制。

requestLayout()表示视图的大小可能已经改变,需要重新测量,然后重新绘制。

invalidate()将调用dispatchDraw(), draw()onDraw()因此它会重新渲染视图。

requestLayout()另一方面,几乎可以完成从测量到重新渲染的所有工作。

为什么有这么多示例(甚至是TextView源代码)调用invalidate()然后requestLayout()就在下一行?

0 投票
2 回答
1724 浏览

android - Android invalidateDrawable()不起作用

我在自定义视图中有一堆可绘制对象。我希望用户能够按下一个或多个可绘制对象并更改颜色。目前,每个可绘制对象都只是StateListDrawable具有两种状态:state_pressed和未按下。每次我按下可绘制对象时,setState都会返回 true,因此我假设它实际上已更改,但我没有看到可绘制图像更改。是invalidateDrawable不是什么都不做?我究竟做错了什么?如何在按下时重绘一个drawable而不需要customView.invalidate()每次都调用和重绘整个东西?我最初是这样做的,但发现我的应用程序运行非常缓慢/效率低下。谢谢!

流量:

这是类中按钮触摸的代码TouchKey(MyTouch 是一个自定义类,用于跟踪 android 设备上的所有触摸):

我是如何StateListDrawable在我的自定义视图中绘制的:

0 投票
0 回答
479 浏览

java - Android 画布滞后

我正在为一个班级创建一个项目,但遇到了一些滞后问题。加载地图后,要么什么都不会发生,因此您必须返回并重新加载它,它会工作一段时间,或者在进行一些移动后,我的手机/模拟器将需要几秒钟,直到您可以进行下一步操作。这就是我设置课程的方式:

我有我的地图类作为主控制器。有不同的地图,但它们的工作原理都是一样的。map 类从布局中设置内容视图,就像普通的具有空的相对布局一样,它创建节点、线并具有游戏规则类来检查玩家执行的不同动作。节点、线条和游戏规则的类扩展了 View,因此在 onDraw() 中,我用定义的坐标绘制正方形并将它们添加到地图类的视图中。根据玩家的行为,线条和节点将调用 postInvalidate() 来更新数字或颜色。在游戏规则类中,它不断检查赢家或输家并显示轮到谁了,但我在 onDraw() 中有 invalidate() ,因此它不断被重绘。绘制了 6 个以上的节点和 10 多条线,游戏规则覆盖了所有内容。

我知道使用 sleep() 并不理想,但是自从创建游戏规则类并在 onDraw() 内部使用 invalidate 以来,我一直在经历这种情况。我在路上,但我可以稍后发布代码。我也被困在这个项目中使用画布,因为没有其他从事这个项目的人接触过 Android。

先感谢您!

TL;DR:如何更好地优化使用画布?

0 投票
2 回答
960 浏览

android - 调用 invalidate() 时计时器在 Android 中不起作用

我想通过绘制一条灰色、白色(与背景匹配)然后再次灰色的路径来创建闪烁效果。我想闪 3 次,显示灰色 1 秒,白色 1 秒,灰色 1 秒,等等。

当我创建一个HandlerforpostDelayed()时,程序跳过了 run() 并没有在时序集中执行它,并且没有发生闪烁:

我将如何使用计时器实现这样的闪烁功能并将其闪烁 3 次?

谢谢!

0 投票
1 回答
654 浏览

java - Invalidate 未调用自定义视图类的 onDraw

屏幕是白色的,并且 onDraw 中的 System.out.println() 从未被调用过。

这是我的 activity_main.xml

自定义视图类:

主要活动: