Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android. Brightness Change

I am trying to resolve following task: smooth change of brightness from 100% to 0%, but can't gain effect of smoothness. Want to emphasize that I am using following approach of brightness change. The recommended one.

WindowManager.LayoutParams lp = window.getAttributes();

lp.screenBrightness = floatPercent;

window.setAttributes(lp);

Well, it obviously works, but not smooth. I will describe logic:

I have a thread that changes brightness:

            while (isRunning()) { 
                Thread.sleep(sleepTime); 
                spentTime+=sleepTime; 
                view.post(new Runnable() { 
                    public void run() { 
                        changeBrightness(); 
                    } 
                }); 
            } 

I have duration of brightness change, for example 10 seconds. I calculate next value of floatPercent (see code snippet above) the way, sleepTime should always be less than 50ms. So looks like it had to be smooth. But I always get not smooth transition. It relates specially the range of 0% - 5% of brightness. Smoothness is completely lost on this brightness range.

I have already posted this question on Google Android Developer group, but anyway possibly somebody have already investigated in this area.

like image 799
Lyubomyr Dutko Avatar asked Dec 03 '22 07:12

Lyubomyr Dutko


2 Answers

From your code snippet, it would appear you are using Thread.sleep() on the UI thread.

Please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please please do not use Thread.sleep() in the UI thread.

Since you are using post(), just switch to postDelayed(), passing it the time to wait before executing the Runnable.

In fact, Thread.sleep() may be cause of the problem you are experiencing, since Thread.sleep() on the UI says "Hey, Android! Please freeze the UI for a while!", so your brightness change may not take place until you return control to Android (e.g., return from whatever callback triggered your code).

Furthermore, what Ms. Hackborn told you on the Google Groups is absolutely correct: this is dependent on hardware. Not all hardware will offer the smoothness you seek. That may be your 0-5% problem -- the hardware only goes to, say, 5% brightness, then makes a jump to having the backlight be off, or something.

like image 178
CommonsWare Avatar answered Dec 11 '22 10:12

CommonsWare


edit: check out commonsware.com's post. I didn't realize you may be trying to sleep the GUI...


Likely problem:

Thread.sleep's argument is only a minimum value. you may be telling it to sleep 50ms, but it may sleep for 80ms one time, 50ms the next, and then 120ms after that. it largely depends on when the processor decides to schedule you.


The best solution:

The best way to get this done would be to have some type of interrupt based on a kernel timer... that is to say, you'd need to get the operating system to call your program whenever some external timer goes off, and have your program handle that call using an interrupt function. TBH, I don't think android was designed to do this, but there may be a different way of handling your situation that approximates it.


The easiest solution:

is instead of

spentTime+=sleepTime; 

do something like this (these functions don't necessarily exist, this is just an example):

   float startTime = get_current_time();
   sleep(50);
   float endTime = get_current_time();
   sleepTime = startTime - endTime;
   spentTime += sleepTime;
   change_brightness.increase_by_amount(sleepTime/spentTime);

... this way the amount of sleep is proportional to the actual sleeping time. Of course it will be delayed by one go through the loop, but that shouldn't matter visually.

like image 36
Ape-inago Avatar answered Dec 11 '22 10:12

Ape-inago