gpt4 book ai didi

android - 在所有应用程序之上绘制 Android Canvas ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:01 25 4
gpt4 key购买 nike

考虑到 Android 的性质,我怀疑这是不可能的,但是有没有一种方法可以创建显示在所有应用程序顶部的某种 View (也许使用 Canvas 对象?)?

我对这个项目的 Intent 不是恶意的。我创建了一些 simple Color Filter software对于 Windows,它只是在所有窗口的顶部添加一个窗口,该窗口填充有用户选择的颜色,并且不透明度较低。这会在屏幕上添加淡淡的色调,帮助患有视视敏感综合症的用户长时间使用计算机。我想制作这个软件的安卓版本。例如:

Color Filter for Android Example

左图是原图,右图是我想要实现的。

有什么办法可以在 Android 上做到这一点?我知道该应用程序必须作为系统服务运行,这样它才不会意外停止,但据我所知,没有办法在其他应用程序之上一般地在屏幕上绘制。如果可能,您能否建议研究哪些 API?

最佳答案

以下是我认为可行的方法:

您将需要以下值:

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

使用 slider 后将它们存储在首选项中:

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

定义一个图层类,它扩展 View 并用于在 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();
}
}

接下来编写一个服务来处理这些值的变化并将它们应用到窗口。

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

//声明 View 以应用存储在 Prefs 中的值私有(private)静态层 View ;...公共(public)静态 int r;公共(public)静态 int b;公共(public)静态 int g;公共(public)静态 int a;公共(public)静态 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 ,

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

将这些 View 添加到窗口

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

不要忘记在 Manifest xml 文件中声明您的服务

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

我可能在即时执行此操作时遗漏了一两件事,但我认为应该这样做。

关于android - 在所有应用程序之上绘制 Android Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com