Фильтр яркости экрана
Есть ли у кого-нибудь идея, как реализовать фильтр яркости экрана, как здесь:
http://www.appbrain.com/app/screen-filter/com.haxor
Мне нужна начальная точка, и я не могу понять, как это сделать.
Ответы
Ответ 1
Просто сделайте прозрачную полноэкранную активность, которая позволяет касатьться. Чтобы сделать штрихи, используйте следующие флаги окна перед настройкой 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);
Ответ 2
-
Получить экземпляр 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
разрешение наложить наложение на экран.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Тестировали это, и оно работает. Дайте мне знать, если вы застряли.
Ответ 3
Конечно, вы не можете использовать это производственный код, но если вы играете, попробуйте Недокументированный взлом
Он использует:
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
Вы также попробуете это:
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);
}