<LinearLayout xmlns:android="http://schemas.android.com/ap...">
FC2ブログ
    02 «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.» 04

    ハルシオンシステムの気まま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   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/35-7d75c1b9
    この記事にトラックバックする(FC2ブログユーザー)