画上的所有应用程序之上一个Android印刷品吗?(Draw an Android canvas o

2019-08-02 18:53发布

我怀疑这是不可能的,因为Android的性质,但有一种方式来创建的所有应用程序的顶部显示排序(也许是使用Canvas对象?)的看法?

我对这个项目的目的不是恶意的。 我创造了一些简单的颜色过滤软件适合Windows,只是增加了在所有的Windows,这是充满了用户选择的颜色顶部的窗口,并具有低透明度。 这增加了浅色调,以帮助用户与Scoptopic敏感综合症用电脑长时间在屏幕上。 我想使这个软件的Android版本。 例如:

左侧的图像是原来的,并在右边的是什么,我想要的目的。

有没有办法在所有与Android做到这一点? 据我所知,应用程序会为系统服务,这样才不会意外停止运行,但据我所知,没有办法对其他应用程序的顶部在屏幕上画一般。 如果可能的话,你可以建议寻找到什么样的API?

Answer 1:

以下是我认为可能的工作:

您将需要以下值:

红,绿,蓝,Alpha和对比度(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();
  }
}

接下来写这应该处理这些值的变化,并将其应用到windows的服务。

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

//声明视图用于施加存储在偏好设置私有静态层视图中的值; ...公共静态INT R; 公共静态INT B; 公共静态INT克; 公共静态INT一个; 公共静态诠释三;

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

我可能会错过一两件事,因为我这样做对飞,但我认为这应该这样做。



文章来源: Draw an Android canvas on top of all applications?