6

Android の性質上、これは不可能だと思いますが、すべてのアプリケーションの上に表示される (おそらく Canvas オブジェクトを使用して) ビューを作成する方法はありますか?

このプロジェクトに対する私の意図は悪意ではありません。ユーザーが選択した色で塗りつぶされ、不透明度が低いウィンドウをすべてのウィンドウの上に追加するだけの、Windows 用の単純なカラー フィルター ソフトウェアをいくつか作成しました。これにより、画面に明るい色合いが追加され、暗所視過敏症候群のユーザーが長時間コンピューターを使用するのに役立ちます。このソフトのAndroid版を作りたいです。例えば:

Android の例のカラー フィルター

左側の画像はオリジナルで、右側の画像は私が達成しようとしているものです。

Androidでこれを行う方法はありますか? アプリケーションが予期せず停止しないようにシステム サービスとして実行する必要があることは理解していますが、私の知る限り、他のアプリケーションの上に画面を一般的に描画する方法はありません。可能であれば、調査すべき API を提案していただけますか?

4

1 に答える 1

12

これが私がうまくいくと思うものです:

次の値が必要です。

赤、緑、青、アルファ、コントラスト (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 private static Layer ビューに格納されている値を適用するためのビューを宣言します。... public static int r; public static int b; public static int g; public static int a; public static 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 = 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 " />

その場でこれを行ったので、1つか2つのことを見逃したかもしれませんが、これでうまくいくはずです。

于 2012-11-15T05:24:57.433 に答える