【问题标题】:Android. Brightness Change安卓。亮度变化
【发布时间】:2015-08-07 02:54:55
【问题描述】:

我正在尝试解决以下任务:亮度的平滑变化 从 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 的下一个值(参见上面的代码 sn-p) 方式,sleepTime 应始终小于 50 毫秒。 所以看起来它必须是光滑的。 但我总是不能顺利过渡。它特别涉及范围 0% - 5% 的亮度。平滑度在此完全丧失 亮度范围。

我已经在 Google Android Developer group 上发布了这个问题,但无论如何可能有人已经在这方面进行了调查。

【问题讨论】:

  • 可能手机无法以每 50 毫秒为线程提供处理器时间的速度进行多任务处理。

标签: java android hardware


【解决方案1】:

从您的代码 sn-p 来看,您似乎在 UI 线程上使用 Thread.sleep()

拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托987654322@ 在 UI 线程中。

由于您使用的是post(),只需切换到postDelayed(),在执行 Runnable 之前给它等待的时间。

事实上,Thread.sleep() 可能是您遇到的问题的原因,因为 UI 上的Thread.sleep() 说“嘿,Android!请冻结 UI 一会儿!”,因此您的亮度变化可能不会发生直到您将控制权返回给 Android(例如,从触发您的代码的任何回调返回)。

此外,Hackborn 女士在 Google 网上论坛上告诉您的绝对正确:这取决于硬件。并非所有硬件都能提供您所寻求的流畅度。这可能是您 0-5% 的问题 - 硬件仅达到 5% 的亮度,然后跳转到关闭背光或其他什么。

【讨论】:

  • 如果在“please please please...”行下方添加'----',它会使文本变为粗体。如果你这样做,你可能不需要那么多的喜悦;)
  • 您好,非常感谢您的回复。这是一套很好的关于改进的新想法,但不幸的是我没能解决我的任务。该线程中提到的每种方法都给出了几乎相同的结果,并且我无法获得亮度过渡的平滑度。屏幕亮度无论如何都会颤抖,但如果您尝试在 Android 设置中快速更改亮度,您会看到类似的行为。无论如何,非常感谢您的帮助。
【解决方案2】:

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


可能的问题:

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


最佳解决方案:

完成此任务的最佳方法是基于内核计时器进行某种类型的中断...也就是说,您需要让操作系统在某个外部计时器关闭时调用您的程序,并让您的程序使用中断函数处理该调用。 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);

...这样睡眠量与实际睡眠时间成正比。当然它会被循环一次延迟,但这在视觉上应该不重要。

【讨论】:

    【解决方案3】:

    请注意,[Thread.sleep](http://developer.android.com/reference/java/lang/Thread.html#sleep(long) 不保证精度,即它可能会阻塞短于或长于 50 毫秒。您可以尝试提高精度,看看是否有助于实现所需的平滑度。

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2023-04-04
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多