Android系统。亮度变化

时间:2009-07-16 11:10:02

标签: java android hardware

我正在尝试解决以下任务:平滑改变亮度 从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开发者小组上发布了这个问题,但无论如何可能有人已经在这方面进行了调查。

3 个答案:

答案 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毫秒。您可以尝试提高精度,看看是否有助于达到预期效果平滑度。