用view实现popwindow效果,弹出菜单.

之前是用popwindow做弹出菜单,发现他只能在最顶层。当加入上滑效果的时候,我们想要的是,从底部的某一个控件底部滑出来,

但是popwindow只能从他上面滑动出来。非常的难看。达不到效果。

因此。用view实现了popwindows。

代码还有待优化。有更好的实现方法请联系我。


/**
<span style="white-space:pre">	</span> * 
<span style="white-space:pre">	</span> * @param activity 
<span style="white-space:pre">	</span> * @param menu   弹出菜单的布局
<span style="white-space:pre">	</span> * @param buttomview  在哪里弹出的布局
<span style="white-space:pre">	</span> * @param homeView  想要监听的逐步局,实现,嗲你家空白地方,关闭view
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public Mymenu(Activity activity, View menu, View buttomview, View homeView) {
<span style="white-space:pre">		</span>this.MENU_VIEW = menu;
<span style="white-space:pre">		</span>this.BUTTOM_VIEW = buttomview;
<span style="white-space:pre">		</span>this.contextView = homeView;
<span style="white-space:pre">		</span>this.activity = activity;
<span style="white-space:pre">		</span>init();


<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * 
<span style="white-space:pre">	</span> * @param mymenuListem 设置回调监听
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public void setMymenuListem(MymenuListem mymenuListem) {
<span style="white-space:pre">		</span>this.mymenuListem = mymenuListem;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>/*
<span style="white-space:pre">	</span>* 监听 菜单关闭和打开
<span style="white-space:pre">	</span>*/
public interface MymenuListem {
public  void onMenuClose();
public  void onMenuOpen();
}

public class Mymenu {
	private View MENU_VIEW, BUTTOM_VIEW;
	private Boolean IsOpen = false;
	private int MENU_HIGHT = 0;
	private int BUTTOM_MARGIN_TOP_HIGHT = 0;
	private int SCREEN_HIGHT = 0;
	private MymenuListem mymenuListem;
	private View contextView;
	private Activity activity;
	public Mymenu(Activity activity, View menu, View buttomview, View homeView) {
		this.MENU_VIEW = menu;
		this.BUTTOM_VIEW = buttomview;
		this.contextView = homeView;
		this.activity = activity;
		init();

	}
	public void setMymenuListem(MymenuListem mymenuListem) {
		this.mymenuListem = mymenuListem;
	}
	public void init() {
		// TODO Auto-generated method stub
		SCREEN_HIGHT = getScreensHeight(activity);
		if (MENU_VIEW != null && SCREEN_HIGHT != 0) {
			ViewPropertyAnimator.animate(MENU_VIEW).translationY(SCREEN_HIGHT)
					.setListener(new AnimatorListener() {
						@Override
						public void onAnimationEnd(Animator arg0) {
							// TODO Auto-generated method stub
							MENU_VIEW.setVisibility(View.VISIBLE);
						}
						@Override
						public void onAnimationCancel(Animator arg0) {
							// TODO Auto-generated method stub
						}
						@Override
						public void onAnimationRepeat(Animator arg0) {
							// TODO Auto-generated method stub
						}
						@Override
						public void onAnimationStart(Animator arg0) {
							// TODO Auto-generated method stub
						}
					});
		}
		if (null != contextView) {
			contextView.setOnTouchListener(new OnTouchListener() {
				@Override
				public boolean onTouch(View v, MotionEvent event) {
					// TODO Auto-generated method stub
					closemenu();
					return true;// 把触摸消耗掉吧
				}
			});
		}

	}
	public Boolean getIsOpen() {
		return IsOpen;
	}

	public void setIsOpen(Boolean isOpen) {
		IsOpen = isOpen;
	}

	public void openmenu() {
		if (!IsOpen) {
			if (MENU_VIEW.getVisibility() != View.VISIBLE) {
				MENU_VIEW.setVisibility(View.VISIBLE);
			}
			if (MENU_HIGHT == 0) {
				MENU_HIGHT = MENU_VIEW.getHeight();
			}
			if (BUTTOM_MARGIN_TOP_HIGHT == 0) {
				BUTTOM_MARGIN_TOP_HIGHT = BUTTOM_VIEW.getTop();
			}
			ViewPropertyAnimator.animate(MENU_VIEW).setDuration(300)
					.translationY(BUTTOM_MARGIN_TOP_HIGHT - MENU_HIGHT);
			IsOpen = true;
			if (null != mymenuListem) {
				mymenuListem.onMenuOpen();
			}
		}
	}

	public void closemenu() {
		if (IsOpen) {
			if (MENU_VIEW.getVisibility() != View.VISIBLE) {
				MENU_VIEW.setVisibility(View.VISIBLE);
			}
			if (MENU_HIGHT == 0) {
				MENU_HIGHT = MENU_VIEW.getHeight();
			}
			if (BUTTOM_MARGIN_TOP_HIGHT == 0) {
				BUTTOM_MARGIN_TOP_HIGHT = BUTTOM_VIEW.getTop();
			}
			ViewPropertyAnimator.animate(MENU_VIEW).setDuration(300)
					.translationY(BUTTOM_MARGIN_TOP_HIGHT);
			IsOpen = false;
			if (null != mymenuListem) {
				mymenuListem.onMenuClose();
			}

		}

	}

	public static int getScreensHeight(Activity activity) {
		DisplayMetrics metrics = new DisplayMetrics();
		activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
		int height = metrics.heightPixels;// 屏幕的高dp
		int statusBarHeight = getStatusHeight(activity);
		return height - statusBarHeight;
	}

	public static int getStatusHeight(Activity activity) {
		int statusHeight = 0;
		Rect localRect = new Rect();
		activity.getWindow().getDecorView()
				.getWindowVisibleDisplayFrame(localRect);
		statusHeight = localRect.top;
		if (0 == statusHeight) {
			Class<?> localClass;
			try {
				localClass = Class.forName("com.android.internal.R$dimen");
				Object localObject = localClass.newInstance();
				int i5 = Integer.parseInt(localClass
						.getField("status_bar_height").get(localObject)
						.toString());
				statusHeight = activity.getResources()
						.getDimensionPixelSize(i5);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				e.printStackTrace();
			}
		}
		return statusHeight;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重播

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值