09 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 11

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【Java】画面にフィルターを設定する方法 

(」・ω・)こんにちは~
大坂です。

LockPickerがアンドロイドアプリ週間ランキング50(2013年9月30日~10月6日)で今週も34位にいました!
来週にはいなくなりそうですね(´・ω・`)

さて、今週の題材です。
覗き見防止なんかにも使えるかもしれない画面フィルターのお話です。

まずはフィルター用のxmlの準備。名前は「filter.xml」
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

ltImageViewを一つ用意するだけです。
続いてJavaのコード。常に画面にフィルターを設定し続けるのでサービスを使用します。
 // サービスを継承したクラス
public class FilterService extends Service {
// フィルター用のViewを準備
View view;
// View設定用のWindowManagerを準備
WindowManager wm;

@Override
public int onStartCommand(Intent intent,int flg, int startId) {
// Viewからインフレータを作成する
LayoutInflater layoutInflater = LayoutInflater.from(this);
// 重ね合わせするViewの設定を行う
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // オーバーレイレイヤーに設定する
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT // ウィンドウの透明化
);

// WindowManagerを取得する
wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

// レイアウトファイルから重ね合わせするViewを作成する
view = layoutInflater.inflate(R.layout.filter, null);
// 今回は黒色で透過率100でフィルターの色を指定。
// 覗き見防止の画像とか用意できればここでは画像を指定
view.setBackgroundColor(Color.argb(100, 0, 0, 0));
// Viewを画面上に重ね合わせする
wm.addView(view, params);
return START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
// TODO 自動生成されたメソッド・スタブ
return null;
}
}

これでフィルター自体は設定完了ですが、
「WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY」を使用するには「AndroidManifest.xml」に以下のパーミッションの設定が必要です。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

そのほか注意点です
①重ねてほかの画像を設定する場合やサービス終了時にはWindowManagerにて「removeView(view)」を実行しないとどんどん重なってしまいます。
②「WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY」を使用するとapkから直接アプリをインストールできなくなる(インストールボタンが押せなくなる)ので、アプリとして公開する場合は注意書きやトーストを出して上げると親切ですかね。

今週はここまでです。
暑いのも明日でやっと終わるみたいですね。平日最後の暑い日なので帰りにビールでも飲みましょう~(ぇ
ではでは、また来週(´・ω・)ノシ
スポンサーサイト

Category: 開発日記(Java)

Thread: 日記

Janre: 日記

tb 0 : cm 0