Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
日本マイクロソフト株式会社
hooks riverpod + state notifier + freezed でのドメイン駆動設計
Shinnosuke Tokuda
Usb接続するアプリを開発した時に試行錯誤した事
Masataka Kono
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
負荷試験ツールlocustを使おう
iRidge, Inc.
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
1
of
14
Top clipped slide
Androidの表示レイヤーと画面常駐型アプリの話
Feb. 10, 2014
•
0 likes
12 likes
×
Be the first to like this
Show More
•
20,889 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
kirimin
Follow
Advertisement
Advertisement
Advertisement
Recommended
PenTesterが知っている危ないAWS環境の共通点
zaki4649
39K views
•
48 slides
凝集度と責務
Toshinori Chiba
283 views
•
33 slides
エンジニア必見!Sreへの第一歩
Takuya Tezuka
1.7K views
•
56 slides
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
12.5K views
•
81 slides
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
Kei Sawada
16.6K views
•
38 slides
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
JPCERT Coordination Center
3K views
•
56 slides
More Related Content
Slideshows for you
(20)
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
•
23K views
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
•
149K views
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
日本マイクロソフト株式会社
•
407 views
hooks riverpod + state notifier + freezed でのドメイン駆動設計
Shinnosuke Tokuda
•
3.4K views
Usb接続するアプリを開発した時に試行錯誤した事
Masataka Kono
•
13.8K views
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
•
10.4K views
負荷試験ツールlocustを使おう
iRidge, Inc.
•
934 views
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
•
27.4K views
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
Takashi Yoshinaga
•
1.2K views
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
•
95.3K views
俺のTerraform CI/CD ライフサイクル
HonMarkHunt
•
1K views
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
Takashi Yoshinaga
•
2.7K views
Amazon Web Services の本気がみたいか !? スピードと高可用性を両立したゲームインフラの構築と事例
Amazon Web Services Japan
•
15.1K views
RESTfulとは
星影 月夜
•
109.8K views
MVVM入門
Kazutoshi Urabe
•
7.7K views
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
博宣 今村
•
6.9K views
Riverpodでテストを書こう
Shinnosuke Tokuda
•
1.4K views
Xamarin で良くやっていたあれを MAUI でする話
m ishizaki
•
663 views
Maven基礎
Toshio Takiguchi
•
44.2K views
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Go Maeda
•
31.3K views
Recently uploaded
(20)
ネットワークパケットブローカー市場.pdf
HinaMiyazu
•
7 views
コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話
Rakuten Group, Inc.
•
10 views
モバイル・クラウド・コンピューティング-データを如何に格納し、組み合わせ、情報として引き出すか
Masahiko Funaki
•
2 views
統計学の攻略_推測統計学の考え方.pdf
akipii Oga
•
246 views
Kubernetes超入門
Takashi Suzuki
•
5 views
【DL輪読会】Egocentric Video Task Translation (CVPR 2023 Highlight)
Deep Learning JP
•
73 views
統計学の攻略_統計的仮説検定の9パターン.pdf
akipii Oga
•
237 views
ペンタエリスリトール市場.pdf
HinaMiyazu
•
3 views
JSONEncoderで詰まった話
とん とんぼ
•
144 views
3Dプリンタって いいね
infinite_loop
•
59 views
社内ソフトスキルを考える
infinite_loop
•
87 views
【DL輪読会】大量API・ツールの扱いに特化したLLM
Deep Learning JP
•
93 views
JSTQB_テストマネジメントとレビュープロセス.pdf
akipii Oga
•
214 views
Forguncy8 製品概要 202305.pptx
フォーガンシー
•
56 views
Voyager: An Open-Ended Embodied Agent with Large Language Models
harmonylab
•
5 views
ChatGPT触ってみた
infinite_loop
•
58 views
AIEXPO_CDLE名古屋紹介
KotaMiyano
•
4 views
GitHub と Azure でアプリケーションとインフラストラクチャの守りを固めるDevSecOps
Kazumi IWANAGA
•
6 views
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
•
137 views
Forguncy製品概要.pptx
フォーガンシー
•
97 views
Advertisement
Androidの表示レイヤーと画面常駐型アプリの話
Androidの表示レイヤーと画面常駐型アプリの話
今回の話 表示レイヤーとは? 任意のレイヤーにViewを表示させる Viewの挙動を設定する 実装時の注意点
表示レイヤーとは? Androidの画面は複数の表示レイヤーによって構成されている。 通常のアプリを表示するレイヤーの他にトースト表示用のレイヤーや着 信画面用のレイヤーなどがある。 レイヤーによって表示順やフォーカスが当てられるかなど挙動が決まっ ている。 通知バーやロック画面より上に表示されるレイヤーもある。 アプリから任意のレイヤーにViewを置く事も出来る。
主なレイヤーの種類 (WindowManager.LayoutParamsの定数参照) TYPE_APPLICATION(アプリが通常表示されるレイヤー) TYPE_PHONE(着信画面のレイヤー) TYPE_TOAST(トーストを表示するレイヤー。タッチイベントを拾えない?) TYPE_SYSTEM_ALERT(バッテリー不足時の警告などに使用されているレイヤー) TYPE_SYSTEM_OVERLAY(画面の一番上に表示されるレイヤー。ロック画面にも 干渉するためフォーカスを取得出来ない) 下に書いたものほど上位のレイヤーです。 ただしレイヤーの順序は明確には決まっていないのか機種やバージョンに異なる場合があるようなので注意。 ※手持ちのGalaxyS3とエミュレータでも挙動が違った・・・。(バグ?)
任意のレイヤーにViewを表示させる 任意のレイヤーにViewを追加するにはWindowManagerクラスの addView(View view, LayoutParams
params)を呼ぶ。 addViewを呼ぶと画面に新しいViewを追加する事が出来る。 viewと一緒に渡すWindowManager.LayoutParamsのコンストラクタ引 数で表示レイヤーを指定出来る。 ServiceからViewを追加する事で、アプリがバックグラウンドにいる時 でも常に画面にViewを表示させ、Serviceから操作出来るようにする。 Viewを消す時はremoveView(View view)を呼ぶ。
WindowManager.LayoutParams WindowManager.LayoutParamsの引数は (int w, int
h, int _type, int _flags, int _format) _typeで指定した値によってViewの表示レイヤーを指定する事が出来る。 _flagsで指定した値によってViewをタッチ出来るかなどの挙動を指定する 事が出来る。
実装例 mWindowManager = (WindowManager)
getSystemService(Context.WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.window, null); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); mWindowManager.addView(view, params); ※ServiceのonStartとかで
実装例 mWindowManager = (WindowManager)
getSystemService(Context.WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.window, null); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); mWindowManager.addView(view, params); このへんがポイント レイヤーはTYPE_TOASTかTYPE_SYSTEM_ALERT辺りを使うのが無難?
動作例 <?xml version="1.0" encoding="utf-8"?> <LinearLayout -省略-
> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="はろーうぃんどう" android:padding="16dp" android:textColor="#000000" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="閉じる" android:textColor="#000000" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="EditText" > </EditText> </LinearLayout>
Viewの挙動を設定する ViewにButtonなどを置きリスナーを登録すれば普通のActivityのように 様々な動作を行える。 ただしイベントを拾えるかはレイヤーの種類と_flagで設定した値による。 先の実装例ではTYPE_SYSTEM_ALERTだが、FLAG_NOT_TOUCHABLE を設定しているため、Viewはイベントを拾わずタッチは後ろのレイヤーに すり抜ける。 →画面にマスクをかけるようなアプリを作れる。
主なFLAGの種類 (WindowManager.LayoutParamsの定数参照) FLAG_NOT_TOUCHABLE(Viewはイベントを拾うことが出来ない) FLAG_NOT_FOCUSABLE(Viewはキー入力イベントのフォーカスを得る事が出来 ない。タッチは拾える) FLAG_KEEP_SCREEN_ON(Viewがある限り画面のバックライトを維持する) 他にもいろいろあるけど説明がややこしくてよく分からなかったので割愛しま した!!
キーイベントのフォーカスについて TYPE_SYSTEM_ALERTなどでは特にFLAGを指定しなければEditTextなど でキーイベントのフォーカスを得る(ソフトキーボードを出す)事が出来ま す。 ただしViewにフォーカスが付いている状態ではタッチイベントを背後のレ イヤーを触れなくなるため、Viewをウィンドウ表示させてる意味が無く なってしまいます。 そこで私の作ったアプリでは通常時はFLAG_NOT_FOCUSABLEを設定し たLayoutParamsを使い、EditTextを触った時のみLayoutParamsを入れ 替えるという処理を行っています。(もっと良い方法あるのかな?)
実装例 @Override public boolean onTouch(View
v, MotionEvent event) { if (v.getId() == mView.getId()) { mWindowManager.updateViewLayout(mView, mNotFocusableParams); } else if (v.getId() == R.id.editText1) { mWindowManager.updateViewLayout(mView, mFocusableParams); } return false; }
実装時の注意点 レイヤーを利用したアプリにはSYSTEM_ALERT_WINDOWのパーミッ ションが必要。 ちゃんとViewを消すような処理を書かないと、設定からアプリを強制終了 するまでViewを消せなくなってしまう可能性がある。 下手な実装をすると端末を何も操作出来ないような状態にも出来てしま う。特に通知バーやロック画面より上にViewを表示させるような場合は細 心の注意が必要。 実装の際はドキュメントをよく読み、多くのバージョンや端末でテストし 問題が起こらないかを確認しましょう。
Advertisement