web-dev-qa-db-ja.com

androidでポップアップウィンドウのアニメーションを作成する方法

アプリケーションにポップアップウィンドウがあり、ボタンがクリックされたときに表示されます。このウィンドウにフェードインアニメーションを設定します。xmlファイルを「res/anim」フォルダに配置し、ポップアップウィンドウのアニメーションスタイルを設定します。動作しません?ここに私のコードがあります:

myanim.xml ...

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha Android:fromAlpha="0.0"
        Android:toAlpha="1.0" 
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="4000"
        Android:repeatCount="1"/>
</set>

==============================================

ポップアップウィンドウを作成する

private PopupWindow showOptions(Context mcon){
    try{ 
        LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.options_layout,null);
        layout.setAnimation(AnimationUtils.loadAnimation(this, R.anim.myanim));
        PopupWindow optionspu = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        optionspu.setFocusable(true);
        optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
        optionspu.update(0, 0, LayoutParams.WRAP_CONTENT, (int)(hei/5));
        optionspu.setAnimationStyle(R.anim.myanim);
        return optionspu;
    }
    catch (Exception e){e.printStackTrace();
    return null;}
}

================================================= onClickメソッド...(optionsPopupはPopupWindow型のグローバル変数です)

 @Override
public void onClick(View v) {
               switch (v.getId()) { 
        case R.id.options:
                optionsPopup=showOptions(this);
            break;  
}
41
Ishaq

問題は、アニメーションスタイルを1セットしか提供していないことだと思います。しかし、実際にはPopupWindowには2つのアニメーションが必要です。 1つはウィンドウが表示されるときに使用され、もう1つはウィンドウを非表示にします。

これはあなたがそれをするべき方法です、

1)2つの異なるアニメーションセットを作成します。

たとえば、popup_show.xmlおよびpopup_hide.xmlを追加して、res内に作成する必要があるanimフォルダーに追加します=フォルダー。

2)ここでvaluesフォルダー内にstyles.xmlというxmlを作成し、これらのアニメーションを次のように追加します。

<style name="Animation">
    <item name="Android:windowEnterAnimation">@anim/popup_show</item>
    <item name="Android:windowExitAnimation">@anim/popup_hide</item>
</style>

3)このスタイルをPopupWindowアニメーションに設定し、

 popup.setAnimationStyle(R.style.Animation);

現在、ウィンドウの出入りを自動的に検出し、必要なアニメーションを提供します。

103
Andro Selva

私はこのコードでポップアップアニメーションを使用しています:

// Creating the PopupWindow
       layoutInflater = (LayoutInflater)     getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       inflatedLayoutView = layoutInflater.inflate(R.layout.packages_popup,null);
     inflatedLayoutView.setAnimation(AnimationUtils.loadAnimation(this, R.animator.popupanim)


    popup_l = new PopupWindow(inflatedLayoutView);

   popup_l.setWidth(FrameLayout.LayoutParams.WRAP_CONTENT);
   popup_l.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);     
   popup_l.setFocusable(true);
   // Clear the default translucent background
   popup_l.setBackgroundDrawable(new BitmapDrawable());       

   popup_l.showAtLocation(parent, Gravity.CENTER, 0 , 0);   

   popup_l.setOutsideTouchable(false);

/res/animator/popupanim.xml(popupanim.xml)にあるアニメーションコードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<alpha Android:fromAlpha="0.0"
        Android:toAlpha="1.0" 
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="500"
        Android:repeatCount="0"/>
</set>
13
aimiliano

これは少し遅いかもしれませんが、アニメーションが表示されなかった理由は、アニメーションを設定する前にポップアップウィンドウを表示しているためです。

optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
optionspu.setAnimationStyle(R.anim.myanim);

2行を逆にすると、アニメーションが表示されます。

optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
5
Simon

PopupWindowカスタムレイアウトはより便利で、表示位置は自由であり、制限はありません。以下のコードを使用して、アニメーションをお楽しみください。このアニメーションでは、下のスライドインとスライドアウトを使用しますが、スライドイン/アウトアニメーションのみを変更し、アニメーションに応じてアプリ内の任意の場所をアニメーション化できます。

アニメーションリソースフォルダー:

1.slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false"
    >

  <translate
      Android:duration="@integer/dialogplus_animation_default_duration"
      Android:fromXDelta="0%"
      Android:fromYDelta="100%"
      Android:toXDelta="0%"
      Android:toYDelta="0%"
      />
</set>

2.slide_out_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false"
    >

  <translate
      Android:duration="@integer/dialogplus_animation_default_duration"
      Android:fromXDelta="0%"
      Android:fromYDelta="0%"
      Android:toXDelta="0%"
      Android:toYDelta="100%"
      />
</set>

スタイル:

<style name="popup_window_animation">
        <item name="Android:windowEnterAnimation">@anim/slide_in_bottom</item>
        <item name="Android:windowExitAnimation">@anim/slide_out_bottom</item>
    </style>

方法:

 private PopupWindow showOptions(Context mcon){
        try{
            LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.popup_option_documents_type,null);
            PopupWindow optionspu = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.setAnimationStyle(R.style.popup_window_animation);
            optionspu.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
            optionspu.setFocusable(true);
            optionspu.setOutsideTouchable(true);
            optionspu.update(0, 0, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.showAtLocation(layout, Gravity.BOTTOM, 0, 0);

            return optionspu;
        }
        catch (Exception e){e.printStackTrace();
            return null;}
    }
4
Kunwar Avanish