我正在制作一个程序,我在面板中有很多面板和面板.
我在这些面板中有一些自定义绘制的控件.
1面板的调整大小功能包含用于调整该面板中所有控件的大小和位置的代码.
现在,只要我调整程序大小,此面板的调整大小就会激活.这导致该面板中的组件大量闪烁.
所有用户绘制的控件都是双缓冲的.
有人可以帮我解决这个问题吗?
我正在阅读Larry Osterman关于调试Windows Vista/7音量控制中闪烁问题的最新博客文章,我突然意识到我不记得曾经在我的OS X笔记本电脑上看到应用程序闪烁.即使是看起来写得不好的应用程序也可以避免我的经验中的闪烁问题.如果没有这个转变为Apple vs Windows辩论(请),为什么OS X应用程序似乎没有相同的闪烁问题?
我很难相信Apple开发人员在编程无闪烁的GUI时非常惊人,而Windows程序员很糟糕,那么原因是什么?OS X API是否需要所有GUI来实现双缓冲?虽然有些应用程序具有稍微缓慢的双缓冲调整大小行为,但许多应用程序没有,并且它们仍然避免闪烁.OS X重绘流程是否与Windows有根本的不同,WM_ERASEBKGRND完全避免了这个问题?还是有其他可能性,我没有看到?
更新:感谢您的回答.我希望我能同时选择ken和cb160的答案,因为它们都很有帮助.
我目前正在尝试使用 MotionLayout 创建工具栏动画。一切正常,除了当 TextView 的大小增加时,以约束为中心并用高度和宽度“wrap_content”定义的 TextView 部分闪烁。如果我将 TextView 与左侧对齐,一切都会按预期进行。这是一个已知的错误还是您知道我如何解决这个问题?
布局
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/motionLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:fitsSystemWindows="false">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="250dp"
android:theme="@style/AppTheme.AppBarOverlay">
<com.example.motionlayout.CollapsibleToolbar
android:id="@+id/constraintToolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="56dp"
app:layoutDescription="@xml/scene_11_header"
app:layout_scrollFlags="scroll|enterAlways|snap|exitUntilCollapsed">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="64dp"
android:src="@drawable/maxmustermann" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Marco Schlosser"
android:textColor="#FFFFFF"/>
<ImageView
android:id="@+id/ivMail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_mail" />
<ImageView
android:id="@+id/ivPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_phone" />
<ImageView
android:id="@+id/ivInfo"
android:layout_width="24dp"
android:layout_height="24dp"
app:srcCompat="@drawable/ic_info_button" />
</com.example.motionlayout.CollapsibleToolbar>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_scrolling" />
Run Code Online (Sandbox Code Playgroud)
场景
<Transition
app:constraintSetEnd="@id/end"
app:constraintSetStart="@id/start"
app:duration="1000"
app:motionInterpolator="linear">
<KeyFrameSet>
<KeyPosition
app:framePosition="30"
app:keyPositionType="deltaRelative"
app:motionTarget="@id/icon"
app:percentX="0.9"
app:percentY="0.1" /> …Run Code Online (Sandbox Code Playgroud) 我已在 Android Studio 中设置了运行 Android Q 的 Nexus 5X:
当我启动它时,总是会出现巨大的闪烁(请参阅https://streamable.com/wdpf0)。
我在 Intel Core i7-6500U 上运行 Arch Linux。我怎样才能解决这个问题?
我有一个调整大小的对话框.它还有一个自定义背景,我为响应WM_ERASEBKGND调用而绘制(当前是对FillSolidRect的简单调用).
调整对话框大小后,会出现巨大的闪烁现象.为了尝试减少闪烁,我枚举所有子窗口并将它们添加到剪切区域.这似乎有点帮助 - 现在闪烁在所有儿童控件中都很明显,因为它们重新粉饰.
如何在调整大小时使对话框无闪烁?我怀疑双缓冲必须发挥作用,但我不知道如何使用带有子控件的对话框(没有让所有子控件所有者绘制或类似的东西).
我应该注意到我使用的是C++(不是.NET)和MFC,尽管欢迎基于Win32的纯解决方案:)
注意:有一件事我尝试了但哪些不起作用(不确定原因)是:
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
Run Code Online (Sandbox Code Playgroud) 我在我们的单页网站上使用JQuery scrollTo插件在不同部分之间垂直滚动.
滚动在所有浏览器中运行良好,除了 iOS Safari,滚动但非常生涩.我在页面上使用了许多其他Jquery插件,因此可能与其中一个插件冲突.
如果有人知道scrollTo的替代方案可以在iPad上顺利运行,或者可以建议从哪里开始解决问题,我会很感激帮助.我试过这个解决方案,但没有成功.
好吧,这将是艰难的...希望大师们提出一个解决方案!
这很难解释,但是这里......
我有两个要素:
<style>
#elem1 {
position:absolute;
left:-1400px;
z-index:1000;
width:100%;
}
.anim {
-webkit-transition: -webkit-transform 0.5s ease;
-moz-transition: -moz-transform 0.5s ease;
-ms-transition: transform 0.5s ease;
-o-transition: -o-transform 0.5s ease;
transition: transform 0.5s ease;
}
.overr {
transform:translate(1400px,0);
-ms-transform:translate(1400px,0);
-webkit-transform:translate(1400px,0);
-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;
}
</style>
<script>
$('#btn a').click(function(){
currentPos = $(window).scrollTop();
$('#elem1).toggleClass('overr');
$('#elem1).attr('style', 'top:' + currentPos + 'px;');
setTimeout(function() {
$('#elem2').toggle(0);
$('#elem1').attr('style', 'top:0');
$(window).scrollTop( 0 );
}, 500)
});
</script>
<div id="elem1" class="anim">content here</div>
<div id="elem2">content 2 here></div>
Run Code Online (Sandbox Code Playgroud)
我想在这里实现的是:元素2根本没有样式,只是一个简单的元素.单击按钮,获取#elem2位置,将#elem1从左侧带入抽屉,使其顶部位于屏幕的当前位置,然后隐藏#elem2,#elem1返回顶部,屏幕向上滚动.
结果是,我在同一页面上,在底部加载了一个完全不同的内容,我可以滚动而不会过度滚动(这在iPhone上需要很多 …
我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.
TMyProgressBar = class(TCustomControl)
Run Code Online (Sandbox Code Playgroud)
我继承了控件TCustomControl,因为我需要Handle和一些TWinControl事件.控件(最多64个项目)是动态创建的,并放在ScrollBox上.当进度更新时,我先打电话InvalidateRect.
所有的绘画工作(一组矩形,DrawText等等 - 从这里启发)都在存储器DC中执行,然后BitBlt在控制器的DC上执行.它无论如何都在闪烁,似乎组件消失并重新出现.恕我直言,它是由背景擦除引起的.
在这个无闪烁的绘图建议中,它是WM_ERASEBKGND按以下方式编写的:
type
TMyProgressBar = class(TCustomControl)
procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;
procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)
但是在另一个组件中,通过TMS(TAdvProgressBar),Result设置0为相同的消息.
现在Windows文档说明:
如果应用程序删除背景,则应返回非零值; 否则,它应该返回零.
我测试了两种变体(结果= 0,1),令我惊讶的是都避免了闪烁.
那么现在,我需要在Delphi代码中加入什么?什么是正确的方法?
任何人都可以解释它们之间的区别和关系
SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true)
Run Code Online (Sandbox Code Playgroud)
和
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Run Code Online (Sandbox Code Playgroud)
他们需要减少闪烁,但是何时以及如何正确使用它们?它们可以单独使用,还是必须成对使用,这是什么原因?
谢谢!
积分:
第一个代码片段是从MSDN页面引用的; 在如何修复用户控件中的闪烁中找到第二个代码片段,原始作者是@HansPassant.
如果我在页面重新提交之前的滚动位置向右滚动,我有一个页面依赖于2d中的翻译将表格移动到屏幕右侧.
我试图捕获的效果是一个在排序表时向右滚动的表(固定标题,有限高度的主体,溢出滚动).
Firefox,甚至令人惊讶的是Edge没有闪烁,只有IE在我使用这种效果时闪烁.
如何抑制CSS翻译的工件以消除这种烦人的IE页面闪烁?
这与我使用提供的代码创建的上一篇文章有关.
固定标题可滚动表 - 如何在页面加载时使用css jquery保留水平滚动位置
jQuery的
function setScroll(id_header, id_table)
{
$('div.'+id_table).on("scroll", function(){ //activate when #center scrolls
var left = $('div.'+ id_table).scrollLeft(); //save #center position to var left
$('div.'+id_header).scrollLeft(left); //set #top to var left
$('#scrollamount').val(left);
});
$('table#'+ id_table).attr("style", "transform:translateX(0px)");
$('table#'+ id_header).attr("style", "transform:translateX(0px)");
$('div.'+ id_table).scrollLeft($('#scrollamount').val());
rows = $('#summary_table tr').length;
if(rows > 1)
{
$('div.'+ id_table).attr("style", "overflow-x: scroll; overflow-y: scroll; max-height: 250px !important");
}
else if(rows == 1)
{
$('div.overlay div.'+ id_header).attr("style", "overflow-x: hidden; overflow-y: none; width: 783px !important"); …Run Code Online (Sandbox Code Playgroud)