Draw an Android canvas on top of all apps?

I suspect this is not possible given the nature of Android, but is there a way to create a representation of types (perhaps using a Canvas object?) That appears on top of all applications?

My intention for this project is not malicious. I created some simple Color Filter software for Windows, which simply adds a window on top of all the windows, which is filled with a user-selected color and has low opacity. This adds a touch of light to the screen, which helps users with Scoptopic Sensitivity Syndrome use their computer for extended periods of time. I would like to make a version of this software for Android. For instance:

Color Filter for Android Example

The image on the left is the original, and on the right is what I'm trying to achieve.

Is there any way to do this with Android? I understand that the application must run as a system service so that it does not stop unexpectedly, but as far as I know, there is no way to draw on the screen on top of other applications as a whole. If possible, can you suggest which APIs to learn?

+6
source share
1 answer

Here is what I think might work:

You will need the following values:

Red, Green, Blue, Alpha and Contrast (r, g, b, a, c)

Save them in preference after using the sliders:

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

Define a layer class that extends the view and is used to draw applied values ​​on the canvas.

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

Then write a service that should handle changes to these values ​​and apply them to windows.

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

// Declare views for applying values ​​that are stored in Prefs private static view of the layer; ... public static int r; public static int b; public static int g; public static int a; public static int c;

In the onCreate method

Get the values ​​previously saved in the settings,

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

set views to set the resulting values,

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

Add these views to the window.

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

Write reusable methods

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

Call these methods where necessary using the service class.

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

Remember to declare your service in the manifest XML file

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

Maybe I missed something because I did it on the fly, but I think it should do it.

+11
source

All Articles