Фильтр яркости экрана

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

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

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

Solutions Collecting From Web of "Фильтр яркости экрана"

Просто сделайте прозрачную полноэкранную активность, которая позволяет касатьться. Чтобы сделать штрихи, используйте следующие флаги окна перед настройкой 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); 
  • Получите экземпляр WindowManager.

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

  • Создайте полноэкранный макет xml (параметры макета, установленные на fill_parent )

  • Установите свое представление как не интерактивное, не настраиваемое, не долгое кликабельное и т. Д., Чтобы прикоснуться к вашему приложению, и приложение сможет его обнаружить.

    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 доступа к наложению на экран требуется разрешение SYSTEM_ALERT_WINDOW .

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

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

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

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

 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"/> 

Вы также попробуете это:

 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); }