我正在尝试解决以下任务:平滑改变亮度 从100%到0%,但不能获得平滑的效果。 要强调我正在使用以下亮度方法 更改。推荐的一个。
WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = floatPercent;
window.setAttributes(lp);
嗯,它显然有效,但不顺畅。 我将描述逻辑:
我有一个改变亮度的线程:
while (isRunning()) {
Thread.sleep(sleepTime);
spentTime+=sleepTime;
view.post(new Runnable() {
public void run() {
changeBrightness();
}
});
}
我有亮度变化的持续时间,例如10秒。
我计算floatPercent
的下一个值(参见上面的代码片段)
方式,sleepTime
应始终小于50毫秒。
所以看起来必须顺利。
但我总是得不顺利过渡。它特别涉及范围
0% - 亮度的5%。在此完全失去平滑度
亮度范围。
我已经在谷歌Android开发者小组上发布了这个问题,但无论如何可能有人已经在这方面进行了调查。
答案 0 :(得分:14)
在您的代码段中,您似乎在UI线程上使用Thread.sleep()
。
请好请(请好请),如请好请,请好,请好请好请好请求好请好请拜访请拜访请不要请{ UI线程中的{1}}。
由于您使用Thread.sleep()
,只需切换到post()
,在执行Runnable之前将时间传递给它。
事实上,postDelayed()
可能是您遇到的问题的原因,因为用户界面上的Thread.sleep()
说“嘿,Android!请冻结用户界面一段时间!”,因此您的亮度会发生变化在将控制权交还给Android之前可能不会发生(例如,从触发代码的任何回调中返回)。
此外,Hackborn女士在Google网上论坛上告诉你的内容绝对正确:这取决于硬件。并非所有硬件都能提供您所寻求的平滑度。这可能是你的0-5%的问题 - 硬件只会达到5%的亮度,然后跳转到关闭背光或其他东西。
答案 1 :(得分:2)
编辑:查看commonsware.com的帖子。我没有意识到你可能正试图睡觉... ...
Thread.sleep的参数只是一个最小值。你可能会告诉它睡50ms,但它可能会睡一次80ms,下一次睡50ms,然后再睡120ms。它在很大程度上取决于处理器何时决定安排你。
完成此任务的最佳方法是根据内核计时器进行某种类型的中断...也就是说,只要某个外部计时器关闭,您就需要让操作系统调用您的程序,并让您的程序使用中断函数处理该调用。 TBH,我认为android不是为了做到这一点而设计的,但可能有一种不同的处理你的情况的方式接近它。
代替
spentTime+=sleepTime;
做这样的事情(这些功能不一定存在,这只是一个例子):
float startTime = get_current_time();
sleep(50);
float endTime = get_current_time();
sleepTime = startTime - endTime;
spentTime += sleepTime;
change_brightness.increase_by_amount(sleepTime/spentTime);
......这样睡眠量与实际睡眠时间成正比。当然,它会延迟一次循环,但这在视觉上并不重要。
答案 2 :(得分:1)
请注意,[Thread.sleep
](http://developer.android.com/reference/java/lang/Thread.html#sleep(long)并不保证精确度,即它可能会阻挡更短或超过50毫秒。您可以尝试提高精度,看看是否有助于达到预期效果平滑度。