オーバーレイ サービスを使用して電話にユーティリティ サイドバーを表示するアプリの開発を開始しました。
私がしたことは、画面の右側に小さな矢印ハンドルを追加することでした。ユーザーがそれをスワイプすると、サイドバーが表示されます。
これは、Jelly Bean まで問題なく機能しました。JB以降、サイドバーを表示するプロセス全体がアニメーション化され始めました。いたるところでアニメーション化されていなければ、これは非常にクールです。
サイドバーを表示および非表示にするために私がしたことは、以下のような単純な updateViewLayout コマンドでした。
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
handlesize, WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT|Gravity.CENTER_VERTICAL;
wm.updateViewLayout(mOverlay, params);
handleButton.setImageResource(R.drawable.handle);
isCompact=true;
このコードはサイドバーを非表示にします。handlesize 変数は、ハンドルの幅です。wm 変数はウィンドウ マネージャーです。つまり、基本的には、ハンドルの幅のみを表示するだけなので、ハンドルの横にある可能性のある他のものはすべて表示されます (サイドバーは表示されません)。高さにも WRAP_CONTENT を使用して、タッチ イベントを吸収する唯一の部分がハンドルによって使用される領域であることを確認し、画面の右側全体がタッチの登録からブロックされないようにします。
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT|Gravity.CENTER_VERTICAL;
wm.updateViewLayout(mOverlay, params);
handleButton.setImageResource(R.drawable.handle_back);
isCompact=false;
サイドバーを表示するコードです。ビュー全体の幅は WRAP_CONTENT に設定されているため、すべてのコンテンツが表示され、高さは MATCH_PARENT に設定されています。
通常、このコードは、ある幅と高さのセットを別の幅と高さのセットに即座に切り替える必要があります。その間には何もありません。しかし、Jelly Bean 以来、これは奇妙なアニメーションを通じてこれを行うようになりました。よくわかりませんが、Project Butter と関係があるのかもしれません。
下のリンクでは、アニメーションの一部のフレームを見ることができます。
http://i.stack.imgur.com/QzZGO.png
閉じた状態でもビューの高さを MATCH_PARENT に設定すると、アニメーションはちょうど水平面上にあるため、右から左になり、見栄えがよくなります。問題は、画面の右側全体をブロックしたくないことです。Chrome でタブを切り替えるなど、サービスの下で実行される可能性のある他のアプリで右からスライドすることには多くの用途があります。
だから私の質問は、この動作を停止するために何をすべきか、またはサイドバーに滑らかなアニメーションをさせるためにそれを有利に利用するために何をすべきか、何か考えがありますか?以上?
どうもありがとう!