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

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

мое намерение для этого проекта не является злонамеренным. Я создал некоторые простое программное обеспечение цветового фильтра для Windows, которая просто добавляет окно поверх всех окон, которое заполнено выбранным пользователем цветом и имеет низкую непрозрачность. Это добавляет легкий оттенок к экрану, который помогает пользователи с синдромом Скоптопической чувствительности используют компьютер в течение длительного времени. Я хотел бы сделать Android-версию этого программного обеспечения. Например:

Color Filter for Android Example

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

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

1 ответов


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

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

красный, зеленый, синий, Альфа и контраст (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
}

/ / объявить представления для применения значений, хранящихся в префах частное статическое представление слоя; ... публичный статический 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);
}

при необходимости вызывайте эти методы с помощью класса service

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

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