Android. 屏幕亮度调整

4

我正在尝试解决以下任务:将亮度从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%的范围。 在这个亮度范围内完全失去了平滑性。
我已经在Google Android开发者组上发布了这个问题,但无论如何可能有人已经在这个领域进行了调查。

可能是手机无法像处理器一样快速地进行多任务处理,以至于无法在每50毫秒内为您的线程分配处理器时间。 - Leonid Shevtsov
3个回答

15

从你的代码片段中看,似乎你正在UI线程上使用了Thread.sleep()

请不要在UI线程上使用Thread.sleep(),拜托拜托拜托拜托拜托拜托拜托拜托拜托。

由于你正在使用post(),只需切换到postDelayed(),并将等待执行Runnable的时间传递给它。

实际上,Thread.sleep()可能是您经历问题的原因,因为在UI上使用Thread.sleep()会说“嘿,Android!请冻结UI一段时间!”,因此您的亮度更改可能直到返回控制权给Android(例如,从触发您的代码的任何回调返回)才会生效。

此外,Hackborn女士在Google Groups上告诉你的绝对正确:这取决于硬件。并非所有硬件都会提供您所需的平滑度。那可能是您0-5%的问题-硬件只能达到例如5%的亮度,然后跳转到关闭背光灯或其他情况。


1
如果你在“请请请…”这行下面添加“----”,它将使文本加粗。如果这样做,你可能不需要那么多的“请”;) - Ape-inago
嗨,非常感谢你的回复。这是一组关于改进的新思路,但不幸的是,我未能成功解决我的任务。在这个讨论中提到的每种方法几乎都得到了相同的结果,我无法获得平滑的亮度过渡。屏幕亮度仍然会抖动,但如果你尝试在Android设置中快速更改亮度,你会看到类似的行为。无论如何,非常感谢你的帮助。 - Lyubomyr Dutko

2

编辑:请查看commonsware.com的帖子。我没有意识到您可能正在尝试睡眠GUI ...


可能的问题:

Thread.sleep的参数只是最小值。您可能告诉它睡眠50ms,但它可能一次睡眠80ms,下一次睡眠50ms,然后在那之后睡眠120ms。这在很大程度上取决于处理器何时决定安排您。


最佳解决方案:

最好的方法是基于内核计时器具有某种类型的中断...也就是说,您需要让操作系统在某些外部计时器触发时调用您的程序,并使用中断函数处理该调用的程序。老实说,我认为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);

...这样,睡眠时间的长度就与实际睡眠时间成正比。当然,它会因为循环而延迟一个周期,但在视觉上不应该有影响。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接