问题标签 [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 回答
901 浏览

android - 无法使用 invalidate() 重绘我的画布位图;

我的游戏需要帮助!我正在用位图绘制我的 playermodel,我想用 ontouch 事件更改模型,但它不起作用,我不知道,我做错了什么:(首先这里是我的 playerclass 是我' m 创建位图:

这是我的游戏面板代码,我在其中调用我的位图(我只给你这个问题所需的部分):

我只想通过 onTouch 事件更改播放器的图像,但它不起作用。

0 投票
1 回答
183 浏览

listview - ListView / GridView 在 Fragment 内不刷新

片段的其他元素得到更新,只有 listview 和 gridview 没有。我可以在日志中看到适配器的内容正在更改,但视图仅在我单击它们或 onResume() 时才会刷新。

我已经在 UIThread、listview.invalidateViews() 和 gridview.invalidateViews() 以及 requestLayout()、requestFocus() 和 performClick() 中尝试了 adapter.notifyDataSetChanged() 和 adapter.notifyDataSetInvalidated(),当我触摸它们时它们会刷新视图区域。

我也尝试过分离/附加片段。

当我再次尝试 gridview.setAdapter 时,内容变为空白并在我单击 gridview 区域时显示为更新。

我正在使用 AndroidAnnotations。

Adapter2 与 Adapter1 相同,但型号和项目不同。这些项目是 @ViewGroups 只是将模型绑定到视图元素。

编辑:现在,最有效的是 requestFocusFromTouch(),但感觉有点小问题。

0 投票
1 回答
309 浏览

android - 返回到具有自定义视图的活动时,Invalidate 无法调用 onDraw

我继承了一些代码,因此我没有真正的自由来更改它。:(

我有一个主要活动,从中调用其他活动(从现在起我将这些活动称为子活动)。每当其中一个完成时,它就会调用完成并将数据返回给主活动。

每个活动(包括主要活动)的顶部都有一个显示自定义视图的栏。自定义视图包含一个画布,该画布具有依赖于网络状态的绘图.. 即 wifi/移动等...

由于“状态”数据永远不会改变,它保存在单例中,视图从单例中获取数据以定义它绘制的内容。这是没有问题的,即数据总是如我所料。

当我第一次启动 MainActivity 时,随着网络的变化,数据会发生变化,并且每次调用“无效”视图都会收到对“onDraw”的系统调用,正如我所期望的那样。

在每个子活动中也是如此。

在完成子活动并返回到 mainActivity 后,对 invalidate 的调用不再导致对 onDraw 的调用发生。

我已经看了很长时间了,只是无法弄清楚出了什么问题。

在我的构造函数中,我有:

每当数据更改时,都会调用以下方法:

现在,还有一件事……在立即返回活动时,我刷新并且这确实绘制正确,即无效确实触发了 onDraw 调用……任何后续网络更改(被传播)都无法导致onDraw 调用。

我想知道这是否与视图以某种方式分离有关。我可以看到调用了“onDetachedFromWindow”,但是触发是子活动的破坏,因此我不明白为什么这会影响 MainActivity,但这是我唯一能想到的。

我希望我已经提供了足够的信息来帮助我的人......

0 投票
1 回答
806 浏览

android - 如何从另一个类调用 invalidate() 方法?

我正在尝试在我的 Android 应用程序中的自定义视图上实现捏缩放功能。我已经使用以下课程来做到这一点。

我想在invalidate()内部调用上述方法,onScale但这是错误的,因为这在我的自定义视图之外。但是,我尝试通过在此处实例化自定义视图来做到这一点,如下所示。

但是这个也返回一个错误。无法实例化我的自定义视图。那么如何在这里调用 invalidate() 方法呢?

0 投票
1 回答
545 浏览

java - OnDraw() 仅在循环后调用一次

我有一个我正在 android studio 中编写的程序,它应该播放一个音符,并根据坐标、歌曲音符名称和播放音符的时间的数组列表扩大一个圆圈的大小。但是,我遇到的问题是所有音符都正确播放,只有最后一个圆圈被绘制,并且在我退出播放所有音符的循环之后。我以前查过这个问题,我得到了一些关于调用的答案setWillNotDraw(false);,但是我在构造函数中调用了它,但我仍然遇到同样的问题。我试过invalidate();在多个不同的地方打电话,但似乎没有任何效果。任何帮助将不胜感激!

我的代码:

构造函数

抽奖时

播放音符的循环 - 我已经检查过,所有圆坐标和音符都包含在正确的数组中:

播放音符和声音的代码:

应该播放动画但仅onDraw();在循环退出后调用的代码

playNote、playSound 和 generateColor 方法

谢谢!

0 投票
0 回答
439 浏览

android - Invalidate() 不调用 onDraw

昨天我问了一个关于 Android 图形的问题,现在我已经启动并运行了基础,我已经在我的自定义视图类中创建了一个渲染循环。

这是绘制我的播放器图像的代码(如果我绘制一次而不是循环绘制它就可以工作。)

在 onDraw 里面:

如果我只渲染播放器并调用invalidate()一次,而不是循环多次,它显示得很好(而且花花公子)。但是,当我将它放在循环块中时,它不会呈现。

根据我的日志,循环是函数式的并且调用invalidate(),但它在循环期间从未真正进入onDraw方法。

如果有人可以解释为什么会发生这种情况,那将非常重要,如果您需要更多信息,请告诉我,我会提供。

编辑: 在我的主 Activity 类中,我有一个用于游戏逻辑的线程,然后在启动逻辑线程后使用主线程进入渲染循环。

我尝试使用我的主线程创建一个单独的线程来渲染和进入游戏循环,但这仍然不起作用。

0 投票
0 回答
213 浏览

android - 在运行时无法更改自定义视图的可绘制矢量

我已经实现了一个自定义视图,它看起来像一个搜索栏,在Custom Score bar末尾附加了可绘制对象。我提供了更改进度颜色、更改进度宽度(以及火箭图标)和更改图标本身(用于不同颜色)的方法。

}

现在我在活动中将它实例化为:

如果我没有在活动中设置指示器图标,则会显示图标,但只要我调用setIndicatorIcon()方法,图标就会消失。我错过了什么?

0 投票
1 回答
370 浏览

android - invalidate() doesn't refresh View

i'm struggling with this for a while, not sure if because almost 2 years of absence in Android DEV or my stupidity, I've tried everything and just cannot redraw my screen even if invalidate() is happening. Here's some code:

GameActivity.java

CanvasActivity.java

movePlayer

So basically, when We swipe to the top, position is being changed by movePlayer (decreasing y in 2d array). Then, every rectangle on screen is being redrawn (whole screen has only rectangles which are drawn with different colors according to array line by line, doesn't matter I suppose). My variables are changing properly, so invalidate() is firing onDraw(), however there's no change on the screen. Any help much appreciated.

0 投票
1 回答
839 浏览

android - 仅更新视图的一部分而不使用 invalidate(Rect)

在我当前的应用程序中,我使用 invalidate(Rect) 来更新我当前视图的一部分,但从 API 28 开始,此方法已被弃用。
所以我的问题是:

1.有没有其他方法可以只更新一部分视图?
2.使用不推荐使用的方法有什么后果?

0 投票
0 回答
937 浏览

android - 你如何使片段视图无效?

好的,所以我有一个显示用户帐户信息的片段。

它的工作方式是它发出一个可能会或可能不会触及服务器的请求,具体取决于已经缓存的信息。

当信息可用时,片段将在其中更新其文本字段的回调。

然而,此时用户界面需要刷新,所以我想发出某种invalidate...

除了那完全没有任何作用。

首先,我注意到this.viewreturn null。因此,我不依赖于此,而是onCreateView明确存储我创建的视图。

然后在我更新了文本字段之后,我打电话给fragmentView.postInvalidate()... 什么都不做。

我也试过doAsync { uiThread { fragmentView.invalidate() } }......这也无济于事。

然后我找到了这个答案并尝试了

...这比什么都不做更糟糕,因为如果您切换到不同的片段并返回,其他两种方式至少会更新视图,而这将永远拒绝显示任何有用的信息。

所以也许我可以通过延迟调用来“作弊”,super::setUserVisibleHint直到我更新了值......不,我不能。

不过,我能做的是,我可以通过烘烤一些东西来强制重绘 ui。这就是我目前正在做的事情。但是,这仍然不能成为解决方案。

如何获得正确的 ui 刷新?

哦,这是一个android.support.v4.app.Fragment,我正在使用一个android.support.v4.app.FragmentStatePagerAdapter在片段之间切换,如果这很重要的话。

完整片段代码: