ほとんどは、時代のニーズを取るか、私はPopUpWindowは会ったが、他のロジックを変更するには、コードの変更をコピーして理解した上であまりしませんでした。視覚的な後背中を見て、私はより快適にそれらを使用して、いくつかのアニメーション効果を追加してみましょうと述べました。しかし、私は前に書いていない他の人を見て、彼はPopUpWindowをいじるようになりました。また、あなたも見ることができます忘れてフォローアップを記録するために記事を書きます。
通訳関連する方法
いくつかの一般的に使用される方法の1)構成
私達はちょうどいくつかの使用の詳細コンストラクタの実際の開発を貼り付けるために、私たちの9はかなりありますPopupWindowのコンストラクタに提供し、文書で確認できます。
公共PopupWindow(コンテキストコンテキスト)
公共PopupWindow(ビューcontentView、int型の幅、int型の高さ)
公共PopupWindow(ビューcontentView)
公共PopupWindow(ビューcontentView、int型の幅、int型の高さ、ブールフォーカス可能)
パラメータは、ディスプレイのフォーカス可能フォーカスかどうか、contentViewビューPopupWindowが表示され、それを説明する必要はありません
2)いくつかの一般的に使用される方法
ここではいくつかの方法がいくつかのより多くを使用する必要がありますされ、他の文書は、自分で見つけることができます:
setContentView(ビューcontentView):セットビューPopupWindow表示
getContentView():ビューはPopupWindowディスプレイを取得
showAsDropDown(ビューアンカー):コントロールの相対位置(N左下)、オフセットなし
showAsDropDown(ビューアンカー、int型XOFF、INT YOFF):コントロールの相対的な位置、オフセット
showAtLocation(ビュー親、INT重力、int型のx、int型のY):親のコントロールに対して(例えば中央Gravity.CENTER、Gravity.BOTTOM等以下)がオフセットしない又は全くオフセットセットPSことができる:親限り、このパラメータとしてビューはそれに活動です!
setWidth / setHeightメソッド:幅と高さを設定することに加えて特定の値を書き込む、又はもWRAP_CONTENT MATCH_PARENT、popupWindow幅と第一層の高さと直接ビューの対応するプロパティを使用することができる、コンストラクタ、幅と高さを指定した方が良いかもしれません。
setFocusable(真):フォーカス、ポップPopupWindow、タッチとPopupWindowsプロセスによって、すべての物理的なボタンを設定します。PopupWindowは(自宅などのシステムレベルのイベントを除く)が消失した後、他のイベントに応答して発生する必要があります。例えば、そのようなPopupWindowはバックキーが最初PopupWindowにあるプレスが消え、表示されたとき、あなたは彼らが背中を押して、どのような場合にはあるしないので、活動レッツPopupWindowが消える終了したいしなければならないと言うことは、正確な、活動を終了する第2のプレスですPopupWindow消えます、あなたはPopupWindowで例の背景を設定する必要があります。
setAnimationStyle(INT):アニメーション
レイアウトを作成します。
次のようにPopUpWindowは、対応するレイアウト文書、シンプルなレイアウトを記述する必要があり、コンテナです。
<?XMLバージョン= "1.0"エンコード= "UTF-8" ?> < のLinearLayout のxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" のandroid:layout_width = "match_parent" のandroid:layout_height =」 match_parent " アンドロイド:clipChildren = "false"の アンドロイド:オリエンテーション= "縦" > < ビュー アンドロイド:ID = "@ + ID / empty_view" アンドロイド:layout_width = "match_parent" のandroid:layout_height = "100dp" アンドロイド:layout_weight =" 1 " /> = "@ + ID /コンテナ" アンドロイド:layout_width = "match_parent" アンドロイド:layout_height = "200dp" アンドロイド:バックグラウンド= "@色/ colorPrimary" アンドロイド:オリエンテーション= "垂直" アンドロイド:重力= "center_vertical" > < のTextViewの アンドロイド:ID = "@ + ID /タイトル" アンドロイド:layout_width = "match_parent" のandroid:layout_height = "60dp" アンドロイド:テキスト= "テスト" /> </ のLinearLayout > </ のLinearLayout >
なお、どこのコード行:
アンドロイド:layout_weight = "1"
このビューがなけれによる他のプロパティに、デフォルトは0で、このプロパティはカバーされ、残りのスペースを表示します。これが私たちのためにマスク層を設定することと同じです。
レイアウト後に書かれた、レイアウトファイルがコンテナに転送する必要があります。
PopUpWindow使用
コードは完全なコードに直接取り付けられ、比較的長いので、閲覧を容易にします。
次のように完全なコードは次のとおりです。
パブリック クラス TestActivityは拡張 AppCompatActivityが実装View.OnClickListener { プライベートPopupWindow mPopupWindow。 民間のViewGroup mContentView。 プライベートボタンmBtn。 @Override 保護された ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState)。 setContentView(R.layout.activity_test)。 mBtn = (ボタン)findViewById(R.id.result)。 mPopupWindow = 新しい PopupWindow(この); mPopupWindow.setContentView(getContentView(この)); mPopupWindow.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); mPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); mPopupWindow.setClippingEnabled(偽); // あなたはPopupWindowの背景を設定しない場合、いくつかのバージョン問題があるでしょう:爆弾ボックス消すことができない外部領域または戻るボタンをクリックするか mPopupWindow.setBackgroundDrawable(新新ColorDrawable(getResources()GETCOLOR(R.color。 .empty_view_backgroundを))); mPopupWindow.setOutsideTouchable(真の); mPopupWindow。 (setFocusable 真の); mPopupWindow.update(); mBtn.setOnClickListener(この); } / ** *ポップアップウィンドウビュー初始化 * * @return 表示 * / プライベートビューgetContentView(コンテキストctx){ mContentView = (のViewGroup)LayoutInflater.from(CTX) .inflate(R.layout.popup、NULL ); ビューemptyViewAbovePanel = mContentView.findViewById(R.id.empty_view)。 emptyViewAbovePanel.setOnClickListener(この); 返すmContentViewを。 } @Override 公共 のボイドonClick(ビューV){ mPopupWindow.dismiss()。int型 I = v.getId(); もし(I == R.id.empty_view){ アニメーションアニメーション = AnimationUtils.loadAnimation(この、R.anim.pop_gone)。 mContentView.startAnimation(アニメーション)。 animation.setAnimationListener(新しいAnimation.AnimationListener(){ @Override 公共 ボイドonAnimationStart(アニメーションアニメーション){ } @Override 公共 ボイドonAnimationEnd(アニメーションアニメーション){ } @Override 公共 ボイド onAnimationRepeat(アニメーションアニメーション){ } })。 } そう なら(I == R.id.result){ mContentView.startAnimation(AnimationUtils.loadAnimation(この、R.anim.pop_in))。 mPopupWindow.showAsDropDown(mBtn、 50、50 )。 } } }
上記のコードは、アドミッションアニメーションを再生し、マスク層を設定します。
アニメーションの設定
外観アニメーションファイルのxml:
<?XMLバージョン= "1.0"エンコード= "UTF-8" ?> < セットのxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" > < 翻訳 アンドロイド:期間= "400" アンドロイド: fromXDelta = "0" アンドロイド:fromYDelta = "0" アンドロイド:toXDeltaは= "0" アンドロイド:toYDelta = "100%" /> </ 設定>
アプローチアニメーションファイルのxml:
<?XMLバージョン= "1.0"エンコード= "UTF-8" ?> < セットのxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" > < 翻訳 アンドロイド:期間= "400" アンドロイド: fromXDelta = "0" アンドロイド:fromYDelta = "100%" アンドロイド:toXDelta = "0" アンドロイド:toYDelta = "0" /> </ 設定>
なぜアニメーションはそれをアニメーションのデフォルトの外観をPopUpWindowありません。青の視覚的な部分のみが、このマスク層のアニメーションを必要としない、次のようなアニメーションを願っていますので、これがあります。だから我々は、追加の処理ロジックを追加する必要があります。デフォルトの設定アニメーション効果を使用する場合は、レイヤーマスクもアニメーション効果を持っている原因となります。
リソースファイルstyle.xmlに次のコード値を追加します。
< スタイル名= "pop_animation" 親= "アンドロイド:アニメーション" > < 項目名= "アンドロイド:windowEnterAnimation" > @のアニメーション/ pop_in </ アイテム> < 項目名= "アンドロイド:windowExitAnimation" > @のアニメーション/ pop_gone </ アイテム> </ スタイル>
アンドロイド:windowEnterAnimation:実行が入力するためのフォームです。
アンドロイドは:windowExitAnimation:実行は、フォームは終了です。
ここでPopupWindowするために使用されました。
mPopupWindow.setAnimationStyle(R.style.pop_animation)。
mPopupWindow.showAtLocation(ビュー、Gravity.CENTER、 0、0);
PopupWindowは、他の同じObjectAnimatorビューを使用したいわけではないので、アニメーションPopupWindowメソッドを追加することですsetAnimationStyle()ので、アニメーションのスタイルを定義する必要があり、かつPopupWindow setAnimationStyle()メソッドを使用します。この場合、あなたは使用することができます。
モンゴル層処理
私のマスク層の方法に加えて、上記の方法のマスク層を他の追加があります。
1)ビューの層を追加します
プライベート ボイドaddMaskView(IBinderトークン){ WindowManager.LayoutParams P = 新しいWindowManager.LayoutParams(); p.width = WindowManager.LayoutParams.MATCH_PARENT。 p.height = WindowManager.LayoutParams.MATCH_PARENT。 p.format = PixelFormat.TRANSLUCENT。 p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL。 p.token = トークン。 p.windowAnimations = android.R.style.Animation_Toast。 maskView = 新しいビュー(コンテキスト)。 maskView.setBackgroundColor(0x7f000000 ); maskView.setFitsSystemWindows(偽); maskView.setOnKeyListener(新しいOnKeyListener(){ @Override 公共 ブール onKey(ビューV、int型のkeyCode、KeyEventのイベント){ 場合(keyCodeが== KeyEvent.KEYCODE_BACK){ removeMaskView(); を返す 真; } を返す 偽; } }); wm.addView(maskView、P)。 }
そして消滅時に削除:
公共 ボイド(){却下 の場合(!maskView = ヌル){ wm.removeViewImmediate(maskViewを)。 maskView = nullを。 } スーパー.dismiss()。 }
2)透明性
その他は、透明性を達成するために直接使用されています。
プライベート ボイド bgAlpha(フロートアルファ){ WindowManager.LayoutParams LP = ((活性)コンテキスト).getWindow()のgetAttributes()。 lp.alpha =アルファ。// 0.0-1.0 ((活性)コンテキスト).getWindow()をsetAttributes(LP)。 }