PopupWindow实现任意位置动画显隐

       现在项目中要实现导航栏(标题栏)下显示一个下拉菜单,从上往下的平移动画。原生PopupWindow的setAnimationStyle设置的动画都是从屏幕外面滑入屏幕内的动画效果,菜单显示动画过程中会发现是从导航栏上面滑过的,达不到我们要的效果。只好自己想办法实现这个动画效果了,然后花了点时间简单封装了一个。完整源码贴在下面,比较简单,所以不多做解释了。有问题也希望大家指出,主要是为了稳定和方便使用。

源码:


package com.android.myapplication;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;

/**
 * Author: zls.
 * Created on 2016/4/22 21:02.
 */
public class PopupWindow {

    private static Handler handler;
    private static xWindow popupWindow;
    private static long DURATION = 0;

    public static void showAtLocation(Context context, View v, int x, int y){
        showAtLocation(context, v, x, y, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    public static void showAtLocation(Context context, View v, int x, int y, int[] anim){
        int enterAnim = 0, exitAnim = 0;
        if(anim.length > 0) enterAnim = anim[0];
        if(anim.length > 1) exitAnim = anim[1];
        showAtLocation(context, v, x, y, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, enterAnim, exitAnim);
    }

    public static void showAtLocation(Context context, View v, int x, int y, int width, int height){
        showAtLocation(context, v, x, y, width, height, 0, 0);
    }

    public static void showAtLocation(Context context, View v, int x, int y, int width, int height, int enterAnim, int exitAnim){
        if(context == null || !(context instanceof Activity) || null == v) return;
        close();
        initView(context, v, width, height, enterAnim, exitAnim);
        popupWindow.showAtLocation(v, 0, x, y);
    }

    public static void showAsDropDown(Context context, View anchor, final View v){
        showAsDropDown(context, anchor, v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    public static void showAsDropDown(Context context, View anchor, View v, int[] anim){
        int enterAnim = 0, exitAnim = 0;
        if(anim.length > 0) enterAnim = anim[0];
        if(anim.length > 1) exitAnim = anim[1];
        showAsDropDown(context, anchor, v, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, enterAnim, exitAnim);
    }

    public static void showAsDropDown(Context context, View anchor, View v, int width, int height){
        showAsDropDown(context, anchor, v, width, height, 0, 0);
    }

    public static void showAsDropDown(Context context, View anchor, View v, int width, int height, int enterAnim, int exitAnim){
        if(context == null || !(context instanceof Activity) || null == v) return;
        close();
        initView(context, v, width, height, enterAnim, exitAnim);
        popupWindow.showAsDropDown(anchor);
    }

    private static void initView(Context context, final View v, int width, int height, int enterAnim, int exitAnim){
        FrameLayout frame = new FrameLayout(context);
        frame.addView(v);
        popupWindow = new xWindow(frame, width, height);
        popupWindow.setFocusable(true);
        popupWindow.setTouchable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00000000")));
        DURATION = 0;
        if(exitAnim > 0) {
            final Animation exitAnimation = AnimationUtils.loadAnimation(context, exitAnim);
            DURATION = exitAnimation.getDuration();
            popupWindow.setOnPreDismissListener(new Runnable() {
                @Override
                public void run() {
                    v.startAnimation(exitAnimation);
                }
            });
        }
        if(enterAnim > 0) {
            Animation animation = AnimationUtils.loadAnimation(context, enterAnim);
            v.startAnimation(animation);
        }
        handler = new Handler(context.getMainLooper());
    }

    public static void close(){
        if(popupWindow != null){
            popupWindow.dismiss();
            popupWindow = null;
            handler = null;
        }
    }

    private static class xWindow extends android.widget.PopupWindow{

        private Runnable onPreDismissListener;

        public xWindow(View v, int w, int h){
            super(v, w, h);
        }

        @Override
        public void dismiss() {
            if(null != onPreDismissListener){
                onPreDismissListener.run();
            }
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    xWindow.super.dismiss();
                }
            }, DURATION);
        }

        public void setOnPreDismissListener(Runnable onPreDismissListener) {
            this.onPreDismissListener = onPreDismissListener;
        }
    }

}

PS:第一篇博文,正在加班,没办法花很多时间来写了,毕竟也比较简单。因为在网上找不到相关的文章,所以只好通过自己的办法去实现了,希望可以帮到一些刚入门的朋友。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值