10

First of all thanks everyone who tries to reply this topic.

I have an activity and I wanted to show a sort of menu at the top of the screen and I used windowmanager to handle this. it was about UI issues I encountered why I choise windowmanager to do such a menu. But for now I want this menu to animate but it seems animation takes no effect. Here is my code.

If anyone has any idea how to animate windowmanager I ll be appreciate.

Animation animShowTopLine;

animShowTopLine = AnimationUtils.loadAnimation(this, R.anim.translate);
        animShowTopLine.reset();
LinearLayout top_line;
WindowManager wm;
WindowManager.LayoutParams wmParams;

LayoutInflater inflate = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    top_line =    (LinearLayout) inflate.inflate(R.layout.line, null);

    wm =(WindowManager) getApplicationContext().getSystemService("window");

    wmParams =new WindowManager.LayoutParams();

    wmParams.type=2002;
    wmParams.format = 1;
    wmParams.flags=40;
    wmParams.width=WindowManager.LayoutParams.FILL_PARENT;
    wmParams.height=WindowManager.LayoutParams.WRAP_CONTENT;

    wmParams.gravity  = Gravity.TOP;

    wm.addView(top_line, wmParams);


    top_line.startAnimation(animShowTopLine);

Thanks in advance. Regards.

4

3 に答える 3

19

まず、正気を保つために、そのような一連の定数をハードコーディングしないでください。ウィンドウ マネージャ サービスの名前は ですContext.WINDOW_SERVICE。窓の種類はWindowManager.LayoutParams.TYPE_PHONE. あなたが設定したフラグは... うーん... WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE(まじで、10 進数でも書かれていますか??)。形式は次のとおりですPixelFormat.RGBA_8888(代わりに使用することを強くお勧めしPixelFormat.TRANSLUCENTます)。

さて、まず、世界で何を使ってTYPE_PHONE? あなたはそれをしたくありません。メイン ウィンドウの上にウィンドウを重ねたい場合は、 を使用する必要がありますTYPE_APPLICATION。実際、Dialogこれを使用して、付属のウィンドウを希望どおりに設定することをお勧めします。ウィンドウマネージャーの操作の詳細はすべてこれで処理され、アニメーション化の方法が制限されることはありません。

ここでの主な問題は、ウィンドウのルート ビューをアニメーション化しようとしていることだと思います。ルート ビューはやや特殊です。ウィンドウの最上部を定義し、ウィンドウと正確に一致し、常にウィンドウのサイズに強制されます。これは、子ウィンドウのレイアウトを駆動するものです。ビュー アニメーションを実行する場合は、ルート ビューをそのままにして (ウィンドウのアンカー)、その中の要素をアニメーション化する必要があります。

とはいえ、古いスタイルのアニメーションを使用しているため、システムがダイアログやアクティビティなどをアニメーション化する方法など、ウィンドウ全体をアニメーション化するより良い方法があります。アニメーションをウィンドウのレイアウトパラメーターに設定します。次に、ウィンドウ マネージャーは、指定したとおりにそのアニメーションをウィンドウ サーフェス全体に適用します。アニメーションの各フレームは、ウィンドウの内容を再描画してから再合成するのではなく、新しいアニメーション変換で画面を再合成するだけでよいため、これはウィンドウ内で行うよりも効率的です。

これを行うには、 を設定しますWindowManager.LayoutParams.windowAnimations。これは、ウィンドウに関連付けられたさまざまなアニメーションを定義するスタイルリソースのリソース ID を取得する整数フィールドです。たとえば、標準ダイアログに使用されるスタイルは次のとおりです。

<style name="Animation.Dialog">
    <item name="windowEnterAnimation">@anim/dialog_enter</item>
    <item name="windowExitAnimation">@anim/dialog_exit</item>
</style>

windowEnterAnimationウィンドウが表示されているときに実行するアニメーション リソースと、ウィンドウが非表示になっているときに実行するアニメーション リソースを設定しwindowExitAnimationます。設定されていない場合、アニメーションは実行されません。

したがって、ここのコードでは、ダイアログを作成し、そのコンテンツをカスタム コンテンツに設定し、その重力、幅、高さをここにある値に設定し、そのwindowAnimationsフィールドをアニメーションを定義するスタイルに設定するだけです。デフォルトのダイアログとは異なる動作が必要な場合は、フラグを微調整することもできます(タッチモーダルなどではありません)。API にDialog.getWindow()は、レイアウト パラメータを設定するために必要なものがすべて含まれています。

于 2013-01-08T02:38:50.410 に答える