2012-11-15 8 views
6

Ich vermute, das ist nicht möglich, angesichts der Natur von Android, aber gibt es eine Möglichkeit, eine Ansicht von Arten zu erstellen (vielleicht mit einem Canvas-Objekt?), Die über allen Anwendungen angezeigt wird?Zeichnen Sie eine Android-Leinwand über alle Anwendungen?

Meine Absicht für dieses Projekt ist nicht bösartig. Ich habe einige simple Color Filter software für Windows erstellt, die einfach ein Fenster über allen Fenstern hinzufügen, das mit einer vom Benutzer gewählten Farbe gefüllt ist und eine geringe Deckkraft hat. Dies bringt einen hellen Farbton auf den Bildschirm, der Benutzern mit Scoptopic Sensitivity Syndrome hilft, einen Computer für längere Zeit zu benutzen. Ich möchte eine Android-Version dieser Software machen. Zum Beispiel:

Color Filter for Android Example

Das Bild auf der linken Seite ist das Original, und die auf dem rechten Seite ist das, was ich zu erreichen versuchen.

Gibt es überhaupt eine Möglichkeit, dies mit Android zu tun? Ich verstehe, dass die Anwendung als Systemdienst ausgeführt werden muss, damit sie nicht unerwartet beendet wird, aber meines Wissens gibt es keine Möglichkeit, den Bildschirm über andere Anwendungen zu zeichnen. Wenn möglich, können Sie vorschlagen, auf welche APIs Sie achten sollten? Hier

Antwort

11

ist, was ich denke, arbeiten kann:

Sie folgende Werte benötigt:

Rot, Grün, Blau, Alpha und Kontrast (r, g, b, a, c)

speichern sie in einer Präferenz nach der Verwendung von Schiebereglern:

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

definieren eine Schicht Clas s, die die Ansicht erweitert und verwendet wird, um die angewendeten Werte auf der Arbeitsfläche zu zeichnen.

Als nächstes schreiben Sie einen Dienst, der die Änderungen in diesen Werten verarbeiten und auf die Fenster anwenden soll.

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

// Ansichten Deklarieren Sie die Werte für die Anwendung, die in Prefs private static Schicht Ansicht gespeichert sind; ... public static int r; public static int b; public static int g; public static int a; public static int c;

Im onCreate Verfahren, die zuvor

Get Werte in den Einstellungen gespeichert,

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

Satz Ansichten für die abgerufenen Werte einstellen,

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

Fügen Sie diese Ansichten zum Fenster

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

schreibt wieder verwendbare Methoden

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

Rufen Sie diese Methoden soweit erforderlich mit der Serviceklasse

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

Vergessen Sie nicht, Ihren Dienst in dem Manifest XML-Datei

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

ich erklären könnte Ich habe ein oder zwei Dinge verpasst, weil ich das spontan gemacht habe, aber ich denke, das sollte es tun.

+0

Auch müssen Sie Flags zu Ansichten hinzufügen, um die ganze Zeit oben zu sein. – tomwesolowski

+0

Also, wie wird diese überlagerte Aktivität in diesem Ansatz Berührungsereignisse an die überlappende Aktivität weitergeben? – Paras