在所有应用程序的顶部绘制Android画布?

在所有应用程序的顶部绘制Android画布?,android,android-service,android-view,Android,Android Service,Android View,考虑到Android的特性,我怀疑这是不可能的,但是有没有一种方法可以创建一个显示在所有应用程序之上的排序视图(可能使用画布对象?) 我对这个项目的意图不是恶意的。我已经为窗口创建了一些,它只是在所有窗口的顶部添加了一个窗口,该窗口由用户选择的颜色填充,并且不透明度较低。这在屏幕上增加了一种浅色调,帮助患有视敏综合症的用户长时间使用电脑。我想做一个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中的值的视图 私有静态层视图; ... 公共静态INTR; 公共静态int b; 公共静态INTG; 公共静态INTA; 公共静态INTC

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


我可能会错过一两件事,因为我在飞行中这样做了,但我认为这应该做到

此外,您还需要向视图添加标志,以便始终位于顶部。那么,在这种方法中,此重叠活动如何将触摸事件传递给重叠活动?