1

我正在尝试制作一个可以改变屏幕亮度的滑块。我已经设法用上面的代码做到了

亮度代码:

BackLightControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub
            float BackLightValue = (float)progress/100.0f;
            int brightnessMode;
            try {
                brightnessMode = Settings.System.getInt(getContentResolver(), 
                        Settings.System.SCREEN_BRIGHTNESS_MODE);

            if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
                Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 
                        Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
            }
              BackLightSetting.setText(String.valueOf(BackLightValue));
              WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
              layoutParams.screenBrightness = BackLightValue;
              getWindow().setAttributes(layoutParams);
            } catch (SettingNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }           

        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }
    });


}

}

问题是它正在工作,我可以在滑动滑块时看到亮度发生变化,但是一旦活动完成,它就会恢复到以前的亮度级别,这是没有意义的。使用滑块时禁用的自动背光设置仍然存在。我做错了什么?另外,如何防止滑块为 0,因为屏幕关闭,并且只有强制关闭应用程序才能重置更改。

4

3 回答 3

3

为防止滑块为 0,如果结果为 0,只需将 1 添加到您的语句中:

float BackLightValue = (float)progress/100.0f;
if(BackLightValue == 0){
   BackLightValue++
}

要保存亮度,请使用以下代码并尝试将您的活动中的完成语句延迟几百毫秒。出于某种原因,这通常可以解决问题。

System.putInt(getContentResolver(), System.SCREEN_BRIGHTNESS, brightness);

只需将此行添加到您想要更改亮度的位置。第三个参数“亮度”应替换为搜索栏中的值。在您的情况下,BackLightValue。请记住,亮度值的范围是 1 到 255。


您可能需要通过此 hack 刷新屏幕:

  • 开始一项活动并立即完成

设置亮度后开始此活动:

context.startActivity(new Intent(context, Bright.class));

虚拟活动可能是:

public class Bright extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

finish();
  }
}
于 2012-09-30T15:26:49.603 回答
1

为防止滑块的值为 0,您可以使用类似于此的版本: Prevent SeekBar from move through a dynamic point,但将其修改为使用 min 的静态值,例如:

//We want a minimum om 20 percent screen brightness
private static int MY_MIN_VALUE = 20;

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if (progress > MY_MIN_VALUE){
        seekBar.setProgress(progress);
        saveScreenBrightness(progreess);
    }

    else
        seekBar.setProgress(MY_MIN_VALUE);     
}

其中方法saveScreenBrightness()是更新亮度的方法。

要将亮度保存到系统,请尝试使用以下代码:

System.putInt(getContentResolver(), System.SCREEN_BRIGHTNESS, brightness);

我还没有测试过这种方法,但它应该可以工作。您也可以尝试阅读这篇文章:以编程方式更改屏幕亮度(与电源小部件一样)

于 2012-09-30T15:22:05.673 回答
0

为防止亮度为 0 值(您希望亮度为 1-255): seekBar.setMax(254); //0-254

//然后使用进度(0-254)代替od,始终使用++进度(1-255)

//并且在设置seekBar进度时使用--brightness

于 2016-03-15T00:13:50.570 回答