总结:
假设我有一个TForm和两个面板.面板与alTop和alClient对齐.alClient面板包含一个TPaintBox,其OnPaint涉及绘图代码.
组件上DoubleBuffered的默认值为false.
在绘图过程中,闪烁是显而易见的,因为表格,面板都绘制了它们的背景.
由于表单由面板覆盖,因此拦截其WM_ERASEBKGND消息可能很好.如果没有,可以看到面板上的闪烁,并在调整窗体大小时在面板的右边缘闪烁,因为窗体会绘制其背景.
其次,因为alTop面板是一个按钮的容器,所以将DoubleBuffered设置为true可能很好,让Delphi确保它没有闪烁.它可能不会带来太多的性能负担.
第三,由于alClient面板仅用作另一个绘图组件的容器,因此该面板很可能不参与组成最终绘图.在这方面,使用TPanel后代而不是标准TPanel可能是好事.在这个TPanel后代中,覆盖受保护的过程Paint并在过程中不执行任何操作,尤其是不继承调用以避免在基类TCustomPanel.Paint中进行FillRect调用.此外,拦截WM_ERASEBKGND消息并且内部也不执行任何操作.这是因为当TPanel.ParentBackground为False时,Delphi负责重新绘制背景,当它为True时,ThemeService负责.
最后,在TPaintBox中绘制没有闪烁:
(1)使用VCL内置绘图例程,可能更好......
(2)使用OpenGL,启用OpenGL的双缓冲.
(3)......
===问:如何消除TPaintBox右边缘的闪烁?===
假设对于一个TForm,我有两个面板.顶部相对于表格对齐alTop并被视为按钮的容器.另一个是相对于表单对齐的alClient,并被视为绘制组件的容器(例如来自VCL的TPaintBox,或来自Graphics32的TPaintBox32).对于后一个面板,它的WM_ERASEBKGND消息被截获.
现在,我在以下示例代码中使用TPaintBox实例.在它的OnPaint处理程序中,我有两个选择来绘制一个我希望无闪烁的绘图.选择1是在填充矩形后绘制的.由于其父面板不应擦除背景,因此绘图应无闪烁.选择2绘制在TBitmap上,然后将其Canvas复制回paintbox.
然而,两种选择都是闪烁的,第二种选择尤其是闪烁.我主要关心的是选择1.如果你调整表格的大小,你可以看到闪烁的主要部分发生在右边缘.为什么会这样?有人可以帮助评论原因和可能的解决方案吗?(注意,如果我在这里使用TPaintBox32而不是TPaintBox,右边缘根本不会闪烁.)
我的第二个担忧是,当使用选项1时,闪烁的次要部分会随机出现在绘图箱上.如果您快速调整表单大小,它不是很明显但仍然可以观察到.此外,当使用选择2时,这种闪烁变得更加严重.我没有找到原因.有人可以帮助评论可能的原因和解决方案吗?
任何建议表示赞赏!!
unit uMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
ExtCtrls, Dialogs;
type
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FPnlCtrl, FPnlScene: TPanel;
FPbScene: TPaintBox;
OldPnlWndProc: TWndMethod;
procedure PnlWndProc(var Message: TMessage);
procedure OnScenePaint(Sender: TObject);
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
Self.Color := clYellow;
Self.DoubleBuffered := …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要在屏幕上平滑滚动波形的java应用程序.我花了很多年的时间通过各种教程来弄清楚如何使这个动画尽可能顺畅.据我所知,我已经做了所有正常的事情来消除闪烁(绘制到屏幕外缓冲区并一步渲染,加上覆盖更新,因此屏幕不会消隐),但我的动画仍然闪烁,屏幕在每次更新之前看起来都被清空了.
我确信有一些基本的(也可能是简单的)我错过了,但我没有想法.我将在下面发布一个说明问题的课程.任何帮助将非常感激.
import java.awt.*;
import javax.swing.*;
public class FlickerPanel extends JPanel implements Runnable {
private float [] pixelMap = new float[0];
/** Cached graphics objects so we can control our animation to reduce flicker **/
private Image screenBuffer;
private Graphics bufferGraphics;
public FlickerPanel () {
Thread t = new Thread(this);
t.start();
}
private float addNoise () {
return (float)((Math.random()*2)-1);
}
private synchronized void advance () {
if (pixelMap == null || pixelMap.length == 0) return;
float [] newPixelMap = new …
Run Code Online (Sandbox Code Playgroud) 我正在研究Android的多媒体视频处理应用程序,我遇到了一些问题.我正在使用FragmentPagerAdapter
包含许多不同片段的类来进行各种视频处理步骤.
我的第一个Fragment
包含一个SurfaceView
和一个MediaPlayer
它提供它,以及各种播放控件.当我从片段1(使用SurfaceView)滑动到片段2(此时为空)时,我的问题就出现了.如果我还没有打电话start()
,没有什么异常发生,我能够正常地在片段之间滑动.start()
然而,一旦我打电话,当我滑动到下一个屏幕时,整个屏幕开始闪烁Fragment
,即使我已经MediaPlayer
处于空闲状态并且它没有输入帧SurfaceView
.唯一阻止这种情况的是通过滑动到第三个来破坏表面和包含视图,Fragment
以便FragmentPagerAdapter
销毁Fragment
一个,或者通过主页或后退按钮退出应用程序以便视图被破坏.
我不能为我的生活弄清楚为什么会发生这种情况,除此之外,SurfaceView
渲染线程可能会以某种方式干扰主UI线程.LogCat上也没有出现异常,所以我有点卡住了.我正在运行一个带有android 4.1的Galaxy Nexus作为我的测试硬件.
任何帮助,将不胜感激!
JT
更新:我已经设法找到了一个解决方法,现在通过覆盖setPrimaryItem()
方法FragmentPagerAdapter
来调用一个方法,在视频播放器停止显示时SurfaceView
从层次结构中删除(removeView()
在其LinearLayout
容器上使用)Fragment
,然后恢复SurfaceView
它的活动时再次.不幸的是,当这种情况发生时仍然有点眨眼,所以如果有人有额外的想法,我将不胜感激!
android flicker surfaceview android-fragments android-mediaplayer
我有一个图形TCustomControl
后代组件,上面有一个TScrollBar
.问题是,当我按箭头键移动光标时,整个画布被涂成背景颜色,包括滚动条的区域,然后滚动条重新绘制,这使滚动条闪烁.我怎么解决这个问题?
这是代码.无需安装组件或在主窗体上放置内容,只需复制代码并分配TForm1.FormCreate
事件:
Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SuperList;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
List: TSuperList;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
List:=TSuperList.Create(self);
List.Top:=50; List.Left:=50;
List.Visible:=true;
List.Parent:=Form1;
end;
end.
Run Code Online (Sandbox Code Playgroud)
SuperList.pas
unit SuperList;
interface
uses Windows, Controls, Graphics, Classes, Messages, SysUtils, StdCtrls, Forms;
type
TSuperList = class(TCustomControl)
public
DX,DY: integer; …
Run Code Online (Sandbox Code Playgroud) 我正在用它border-radius: 50%;
来制作图像.默认情况下,图像模糊和缩放(带有隐藏的溢出),并且在悬停时它将删除模糊和缩放.但是,当我在元素上使用CSS转换时,它会暂时显示转换持续时间的溢出.
我正试图弄清楚如何解决我的问题.我已经阅读http://groups.google.com/group/android-developers/browse_thread/thread/a2aac88a08cb56c2/b7dff4ba388cd664?lnk=gst&q=SurfaceView#b7dff4ba388cd664这些问题可以解答我的问题,但据我所知,这是一种"艰难的运气"答案.所以这是我的问题:
我正在以正常方式使用SurfaceView(lock/unlockAndPost)在表面改变时绘制我的游戏背景的位图(例如方向等)并且我渲染一系列移动圆(最多30个半径为约25.f).这些圈子的位置的x,y数据来自服务器,并且一切正常.所有圆形对象都存储在列表中,并且它们的位置会更新,以确保同步更新.然而,当我将这些圆圈绘制到屏幕上时(在canvas.lock()期间),大多数时候它们渲染得很好但偶尔(例如每隔几秒一次),一些圆圈似乎会撕裂或闪烁一帧.圆的数量总是不变的,所以这不是问题,并且没有对圆列表的并发修改(正如我所说,它是同步的).我甚至尝试将所有这些圆形绘制到每个渲染循环上的位图并将该位图绘制到主画布.这似乎只会影响性能(~13FPS,而不是直接将圆圈绘制到主画布时的〜30FPS).对不起,如果这些信息有点模糊,(试图让公司高兴:p)但我只是想知道是否有人能给我一个线索?或者我只是运气不好.我应该注意到来自服务器的定位数据是实时数据,渲染反映这些实时位置至关重要.对不起,如果这些信息有点模糊,(试图让公司高兴:p)但我只是想知道是否有人能给我一个线索?或者我只是运气不好.我应该注意到来自服务器的定位数据是实时数据,渲染反映这些实时位置至关重要.对不起,如果这些信息有点模糊,(试图让公司高兴:p)但我只是想知道是否有人能给我一个线索?或者我只是运气不好.我应该注意到来自服务器的定位数据是实时数据,渲染反映这些实时位置至关重要.
谢谢你的帮助!克里斯
编辑:
很公平.这是来自渲染线程的run().
@Override
public void run() {
Canvas c;
while (mRun) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
panel.onDraw(c);
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
很标准的东西(几乎是月球着陆器的副本:p)
@Override
public void surfaceCreated(SurfaceHolder holder) {
mBackground= Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.RGB_565);
screenOrientation = getResources().getConfiguration().orientation;
if(thread.getState()== Thread.State.TERMINATED){
thread = new RenderThread(holder, this);
thread.setRunning(true);
thread.start();
}else {
thread.setRunning(true);
thread.start();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int …
Run Code Online (Sandbox Code Playgroud) 我的android ADT Eclipse已进入一种状态,每次我在XML编辑器之间切换它都很慢.此外,还有一个闪存的Reload Dependencies和Turn Grammar Constraints Off工具栏按钮.我该如何解决?
但是在每次超时时,UI都会闪烁(短时间内为空模型).在新数据到达后如何更新模型(和视图)以避免这种闪烁效应?
这是我当前的控制器(从step_11(Angular.js教程)略微修改):
function MyPollingCtrl($scope, $routeParams, $timeout, Model) {
(function tick() {
$scope.line = Model.get({
modelId : $routeParams.modelId
}, function(model) {
$timeout(tick, 2000);
});
})();
}
Run Code Online (Sandbox Code Playgroud)
//编辑:我正在使用当前稳定的Angular.js 1.0.6
我正在使用 React Native TextInput 构建货币输入组件。当用户打字时,要求文本应始终采用以下格式:
$ + [integer-part] . [2 digits decimals]
因此,例如,如果用户输入2
,则应自动将其格式化为$0.02
. 我可以在用户键入时执行格式化,如下面的屏幕截图所示:
基本上,使用 onChangeText,我应用了一些格式,然后使用格式化的值调用 setState。
这里的问题是新输入的字符在正确格式化之前会说一秒钟。这会导致 TextInput 短暂闪烁。
我看过这个类似的问题。但不仅我无法理解接受的答案如何解决我的问题。即使我按照建议做了,它也不起作用。
我不知道如何解决这个问题:似乎 TextInput 无法完全“控制”,因为它显示了一个输入字符,尽管我已经明确说明:
value={this.state.value}
来自社区的任何帮助将不胜感激
假设我们有这个带有缩放比例的条形图竞赛x-axis
。从这个考虑的代码完全回答的@乔恩春季和添加(有生线之前)非常最后一行:
library(tidyverse)
library(gganimate)
library(gapminder)
theme_set(theme_classic())
gap <- gapminder %>%
filter(continent == "Asia") %>%
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = min_rank(-gdpPercap) * 1) %>%
ungroup()
p <- ggplot(gap, aes(rank, group = country,
fill = as.factor(country), color = as.factor(country))) +
geom_tile(aes(y = gdpPercap/2,
height = gdpPercap,
width = 0.9), alpha = 0.8, color = NA) +
# text in x-axis (requires clip = "off" in …
Run Code Online (Sandbox Code Playgroud) flicker ×10
android ×2
delphi ×2
surfaceview ×2
angularjs ×1
animation ×1
blur ×1
concurrency ×1
css ×1
css3 ×1
eclipse ×1
editor ×1
gganimate ×1
ggplot2 ×1
hover ×1
java ×1
paint ×1
paintbox ×1
performance ×1
polling ×1
r ×1
react-native ×1
rendering ×1
rest ×1
setstate ×1
swing ×1
tearing ×1
textinput ×1
tpanel ×1
xml ×1