Нарисуйте холст Android поверх всех приложений?

Я подозреваю, что это невозможно, учитывая природу Android, но есть ли способ создать представление о типах (возможно, используя объект Canvas?), Который отображается поверх всех приложений?

Мое намерение для этого проекта не является злонамеренным. Я создал несколько простых программ Color Filter для Windows, которые просто добавляют окно поверх всех окон, которое заполняется выбранным пользователем цветом и имеет низкую непрозрачность. Это добавляет легкий оттенок на экран, который помогает пользователям с синдромом Scoptopic Sensitivity Syndrome использовать компьютер в течение длительных периодов времени. Я хотел бы сделать версию этого программного обеспечения для Android. Например:

Цветной фильтр для Android

Изображение слева – это оригинал, а справа – то, чего я пытаюсь достичь.

Есть ли вообще способ сделать это с Android? Я понимаю, что приложение должно запускаться как системная служба, чтобы он не был неожиданно остановлен, но, насколько мне известно, нет возможности в целом рисовать на экране поверх других приложений. Если возможно, можете ли вы предложить, на какие API-интерфейсы посмотреть?

Вот что я думаю, может работать:

Вам понадобятся следующие значения:

Красный, Зеленый, Синий, Альфа и Контраст (r, g, b, a, c)

Храните их в предпочтении после использования слайдеров:

private SharedPreferences pref; //In onCreate.. this.pref = getSharedPreferences("pref", 0); //Method to save the values in Preferences private void save() { SharedPreferences.Editor localEditor = this.pref.edit(); localEditor.putInt("a", this.a); localEditor.putInt("r", this.r); localEditor.putInt("g", this.g); localEditor.putInt("b", this.b); localEditor.putInt("c", this.c); localEditor.commit(); } 

Определите класс слоев, который расширяет представление и используется для рисования применяемых значений на холсте.

 import android.view.View; import android.graphics.Canvas; import android.content.Context; public class Layer extends View { private int a; private int b; private int g; private int r; public Layer(Context context){ super(context) } protected void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawARGB(this.a, this.r, this.g, this.b); } public void setColor(int a, int r, int g, int b){ this.a = a; this.r = r; this.g = g; this.b = b; invalidate(); } } 

Затем напишите службу, которая должна обрабатывать изменения этих значений и применять их к окнам.

 public class ScreenAdjustService extends Service { //Handle everything here } 

// Объявлять представления для применения значений, которые хранятся в представлении приватного статического представления Prefs; … public static int r; Public static int b; Public static int g; Public static int a; Public static int c;

В методе onCreate,

Получать значения, ранее сохраненные в настройках,

 SharedPreferences localSharedPreferences = getSharedPreferences("pref", 0); a = localSharedPreferences.getInt("a", 0); r = localSharedPreferences.getInt("r", 0); g = localSharedPreferences.getInt("g", 0); b = localSharedPreferences.getInt("b", 0); c = localSharedPreferences.getInt("c", 0); 

Установить представления для установки полученных значений,

 view = new Layer(this); redView = new Layer(this); ... 

Добавьте эти представления в окно

 //Pass the necessary values for localLayoutParams WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(...); WindowManager localWindowManager = (WindowManager)getSystemService("window"); localWindowManager.addView(view, localLayoutParams); localWindowManager.addView(redView, localLayoutParams); localWindowManager.addView(greenView, localLayoutParams); 

Напишите многоразовые методы

 public static void setAlpha(int alpha){ //Handle all conditions view.setColor(alpha, 0, 0, 0); } public static void setContrast(int contrast){ //Handle all conditions view.setColor(c, 100, 100, 100); } public static void setRGB(int r, int g, int b){ //Handle all conditions redView.setColor(r, 255, 0, 0); greenView.setColor(g, 0, 255, 0); blueView.setColor(b, 0, 0, 255); } 

Вызовите эти методы везде, где это необходимо, используя класс обслуживания

 ScreenAdjustService.setRGB(MyActivity.this.r, MyActivity.this.g, MyActivity.this.b); ScreenAdjustService.setAlpha(MyActivity.this.a); ScreenAdjustService.setContrast(MyActivity.this.c); 

Не забудьте объявить свою службу в XML-файле манифеста

 <service android:name=".ScreenAdjustService " /> 

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