现在项目中要实现导航栏(标题栏)下显示一个下拉菜单,从上往下的平移动画。原生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;
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 {
* 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;
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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")));
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());
}
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;
}
}
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);
}
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 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;
}
}
this.onPreDismissListener = onPreDismissListener;
}
}
}
PS:第一篇博文,正在加班,没办法花很多时间来写了,毕竟也比较简单。因为在网上找不到相关的文章,所以只好通过自己的办法去实现了,希望可以帮到一些刚入门的朋友。