[英]Android. Brightness Change
我正在尝试解决以下任务:将亮度从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
应始终小于50ms。 所以看起来必须顺利。 但我总是得不顺利过渡。 它特别涉及0% - 5%亮度的范围。 在此亮度范围内完全失去平滑度。
我已经在谷歌Android开发者小组上发布了这个问题,但无论如何可能有人已经在这个领域进行了调查。
从您的代码片段中,您可能会在UI线程上使用Thread.sleep()
。
请好,请好请,请好请,请好,请好请好请好请好请好请求好请求请请请请不要使用Thread.sleep()
在UI线程中。
由于您使用的是post()
,只需切换到postDelayed()
,在执行Runnable之前将时间传递给它。
事实上, Thread.sleep()
可能是您遇到的问题的原因,因为UI上的Thread.sleep()
说“嘿,Android!请暂停UI一段时间!”,因此您的亮度变化可能不会直到您将控制权返回给Android(例如,从触发您的代码的任何回调返回)。
此外,Hackborn女士在Google Groups上告诉你的内容绝对正确:这取决于硬件。 并非所有硬件都能提供您所寻求的平滑度。 这可能是你的0-5%的问题 - 硬件只会达到5%的亮度,然后跳转到关闭背光或其他东西。
编辑:查看commonsware.com的帖子。 我没有意识到你可能正试图睡觉GUI ...
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);
......这样,睡眠量与实际睡眠时间成正比。 当然它会延迟一次循环,但这在视觉上并不重要。
请注意[ Thread.sleep
]( http://developer.android.com/reference/java/lang/Thread.html#sleep ( long)不保证精确度,即它可能会阻塞短于或长于50毫秒。可以尝试提高精度,看看是否有助于达到理想的平滑度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.