2010-11-26 1 views
14

Кто-нибудь есть идеи, как реализовать Фильтр яркости экрана, как один здесь:Фильтр яркости экрана

http://www.appbrain.com/app/screen-filter/com.haxor

мне нужна отправная точка, и я не могу понять, как это сделать.

+0

Я столкнулся с такой же проблемой. Я также разместил этот вопрос http://stackoverflow.com/questions/2222146/control-screen-brightness-in-android-using-background-service. Я смог решить проблему. U может видеть правильный метод в сообщении. – 2011-04-14 08:09:50

+0

попробуйте эту ссылку, это может помочь вам немного: http://android-er.blogspot.com/2011/02/change-android-screen-brightness.html – 2011-05-20 12:56:03

ответ

8

Просто сделайте прозрачную полноэкранную активность, которая позволяет касатьться. Для того, чтобы пройти через прикосновение использовать следующие флаги окна перед установкой contentView:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    Window window = getWindow(); 

    // Let touches go through to apps/activities underneath. 
    window.addFlags(FLAG_NOT_TOUCHABLE); 

    // Now set up content view 
    setContentView(R.layout.main); 
} 

Для вашего файла макета main.xml просто использовать полный экран LinearLayout а с прозрачным фоном:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/background" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#33000000"> 
</LinearLayout> 

Затем, чтобы настроить «яркость» просто изменить значение цвета фона из кода где-нибудь:

findViewById(R.id.background).setBackgroundColor(0x66000000); 
+0

Спасибо, это работает с настройкой прозрачности, но прикосновение события кажутся странными, я могу прокручивать, но когда я нажимаю значок программы, кажется, что он замораживается (не совсем замораживается, но не открывает программы) – Alex 2010-11-26 20:13:56

+0

Любые другие идеи? Я не думаю, что наличие прозрачной активности сверху solution – Alex 2010-11-29 12:20:57

0

Вы ча попробовать это также:

protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.max_bright); 



     WindowManager.LayoutParams lp = getWindow().getAttributes(); 

     lp.screenBrightness = 100/100.0f; 

     getWindow().setAttributes(lp); 

    } 
1

Конечно, вы не можете использовать это производство код, но если вы играете вокруг .. попробовать это Undocumented hack

Он использует:

private void setBrightness(int brightness) { 
try { 
    IHardwareService hardware = IHardwareService.Stub.asInterface(
    ServiceManager.getService("hardware")); 
    if (hardware != null) { 
    hardware.setScreenBacklight(brightness); 
    } 
} catch (RemoteException doe) {   
    }   
} 

Помните, что он использует это разрешение:

<uses-permission android:name="android.permission.HARDWARE_TEST"/> 
4
  • Получить экземпляр WindowManager.

    WindowManager windowManager = (WindowManager) Class.forName("android.view.WindowManagerImpl").getMethod("getDefault", new Class[0]).invoke(null, new Object[0]);

  • Создание макета полного экрана XML (параметры макета набор для fill_parent)

  • Установите вид не интерактивный, не фокусируемый, не долго Clickable, и т.д., так что прикосновение передается через ваше приложение и приложение могут его обнаружить.

    view.setFocusable(false);
    view.setClickable(false);
    view.setKeepScreenOn(false);
    view.setLongClickable(false);
    view.setFocusableInTouchMode(false);

  • Создать параметр макета типа android.view.WindowManager.LayoutParams. LayoutParams layoutParams = new LayoutParams();

  • Набор параметров макета, как высота, ширина и т.д.

    layoutParams.height = LayoutParams.FILL_PARENT; 
    layoutParams.width = LayoutParams.FILL_PARENT; 
    layoutParams.flags = 280; // You can try LayoutParams.FLAG_FULLSCREEN too 
    layoutParams.format = PixelFormat.TRANSLUCENT; // You can try different formats 
    layoutParams.windowAnimations = android.R.style.Animation_Toast; // You can use only animations that the system to can access 
    layoutParams.type = LayoutParams.TYPE_SYSTEM_OVERLAY; 
    layoutParams.gravity = Gravity.BOTTOM; 
    layoutParams.x = 0; 
    layoutParams.y = 0; 
    layoutParams.verticalWeight = 1.0F; 
    layoutParams.horizontalWeight = 1.0F; 
    layoutParams.verticalMargin = 0.0F; 
    layoutParams.horizontalMargin = 0.0F; 
    
  • Ключевой шаг: Вы можете установить, какой процент яркости вам нужно. layoutParams.setBackgroundDrawable(getBackgroundDrawable(i));

    private Drawable getBackgroundDrawable(int i) { 
    int j = 255 - (int) Math.round(255D * Math.exp(4D * ((double) i/100D) - 4D)); 
    return new ColorDrawable(Color.argb(j, 0, 0, 0));} 
    
  • Наконец добавить вид на WindowManager, созданный ранее.

    windowManager.addView(view, layoutParams);

Примечание: Вам нужно SYSTEM_ALERT_WINDOW разрешение проложить накладку на экране.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

Протестировано это, и оно работает. Дайте мне знать, если вы застряли.