热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android懒人专用PopupWindow的工具类

前言:这段时间一直忙于学习oracle,忽略了博客的编写,总感觉心若浮萍,无根飘摇,还是写篇博客稳一下心情吧。本篇博客适合刚入行工作的小菜鸟和不想重复编写PopupWindow弹出框的

前言:这段时间一直忙于学习oracle,忽略了博客的编写,总感觉心若浮萍,无根飘摇,还是写篇博客稳一下心情吧。本篇博客适合刚入行工作的小菜鸟和不想重复编写PopupWindow弹出框的圆圆们。

用法:
首先还是看一下用法,只需要在使用的地方一句话链式编写就可以了。

①基本用法
PopWindowUtil.getInstance().makePopupWindow().showLocationWithAnimation()
你没有看错,就是这一句话就可以了,这句代码有返回值,返回值是一个PopupWindow对象,其中方法里面的参数请详细向下看。

②高级用法
PopWindowUtil.getInstance().setOnDissmissListener();
PopWindowUtil.getInstance().makePopupWindow().showLocationWithAnimation()
高级用法就是在实例化PopupWindow之前先设置监听,此监听是自定义的接口实现PopupWindow消失后的逻辑处理操作,后面有详细介绍。

详细实现:
如果你只想使用,那么下面就不用看了,但作为一个有追求的青年,知其然也要知其所以然。

① PopWindowUtil工具类单例模式:
作为工具类,这里我们让他变成单例模式,通过getInstance()方法获取单实例。单例模式的具体实现有四种方式[详情请参考博文:http://blog.csdn.net/u012416928/article/details/43149343],此处采用了第四种写法,具体请看代码:

private static PopWindowUtil instance;

// 私有化构造方法,变成单例模式
private PopWindowUtil() {

}

// 对外提供一个该类的实例,考虑多线程问题,进行同步操作
public static PopWindowUtil getInstance() {
if (instance == null) {
synchronized (PopWindowUtil.class) {
if (instance == null) {
instance = new PopWindowUtil();
}
}
}
return instance;
}`

②创建PopupWindow:此处注释比较清楚,直接贴代码

` /**
* @param cx
* activity
* @param view
* 传入需要显示在什么控件下
* @param view1
* 传入内容的view
* @return
*/
public PopWindowUtil makePopupWindow(Context cx, View view, View view1, int color) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager wmManager=(WindowManager) cx.getSystemService(Context.WINDOW_SERVICE);
wmManager.getDefaultDisplay().getMetrics(dm);
int Hight = dm.heightPixels;

mPopupWindow = new PopupWindow(cx);

mPopupWindow.setBackgroundDrawable(new ColorDrawable(color));
view1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// 设置PopupWindow的大小(宽度和高度)
mPopupWindow.setWidth(view.getWidth());
mPopupWindow.setHeight((Hight - view.getBottom()) * 2 / 3);
// 设置PopupWindow的内容view
mPopupWindow.setContentView(view1);
mPopupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
mPopupWindow.setTouchable(true); // 设置PopupWindow可触摸
mPopupWindow.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸

return instance;
}

③ 设置PopupWindow的显示动画及显示位置

`/**
*
* @param cx 此处必须为Activity的实例
* @param view 显示在该控件之下
* @param xOff 距离view的x轴偏移量
* @param yOff 距离view的y轴偏移量
* @param anim 弹出及消失动画
* @return
*/`
`public PopupWindow showLocationWithAnimation(final Context cx, View view,
int xOff, int yOff, int anim) {
// 弹出动画
mPopupWindow.setAnimationStyle(anim);

// 弹出PopupWindow时让后面的界面变暗
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =0.5f;
((Activity) cx).getWindow().setAttributes(parms);

int[] positon = new int[2];
view.getLocationOnScreen(positon);
// 弹窗的出现位置,在指定view之下
mPopupWindow.showAsDropDown(view, positon[0] + xOff, positon[1] + yOff);
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// PopupWindow消失后让后面的界面变亮
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =1.0f;
((Activity) cx).getWindow().setAttributes(parms);
//自定义接口进行弹出框消失时的操作
if (mListener != null) {
mListener.dissmiss();
}
}
});

return mPopupWindow;
}`

④ PopupWindow消失时的操作:自定义接口进行通讯

`  private interface OnDissmissListener{

void dissmiss();

}

private OnDissmissListener mListener;

public void setOnDissmissListener(OnDissmissListener listener) {
mListener = listener;
}`

⑤ PopupWindow弹出及消失动画:

此处的动画就是在res文件夹下styles.xml文件中定义动画名称,然后在anim文件夹下定义对应的弹出和消失动画。下方以一张图代替。此处图片为截取别人的图,不做商业用途,仅供学习。
这里写图片描述

完整代码:

`public class PopWindowUtil {

private static PopWindowUtil instance;

private PopupWindow mPopupWindow;

// 私有化构造方法,变成单例模式
private PopWindowUtil() {

}

// 对外提供一个该类的实例,考虑多线程问题,进行同步操作
public static PopWindowUtil getInstance() {
if (instance == null) {
synchronized (PopWindowUtil.class) {
if (instance == null) {
instance = new PopWindowUtil();
}
}
}
return instance;
}

/**
* @param cx
* activity
* @param view
* 传入需要显示在什么控件下
* @param view1
* 传入内容的view
* @return
*/
public PopWindowUtil makePopupWindow(Context cx, View view, View view1, int color) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager wmManager=(WindowManager) cx.getSystemService(Context.WINDOW_SERVICE);
wmManager.getDefaultDisplay().getMetrics(dm);
int Hight = dm.heightPixels;

mPopupWindow = new PopupWindow(cx);

mPopupWindow.setBackgroundDrawable(new ColorDrawable(color));
view1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// 设置PopupWindow的大小(宽度和高度)
mPopupWindow.setWidth(view.getWidth());
mPopupWindow.setHeight((Hight - view.getBottom()) * 2 / 3);
// 设置PopupWindow的内容view
mPopupWindow.setContentView(view1);
mPopupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
mPopupWindow.setTouchable(true); // 设置PopupWindow可触摸
mPopupWindow.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸

return instance;
}

/**
*
* @param cx 此处必须为Activity的实例
* @param view 显示在该控件之下
* @param xOff 距离view的x轴偏移量
* @param yOff 距离view的y轴偏移量
* @param anim 弹出及消失动画
* @return
*/
public PopupWindow showLocationWithAnimation(final Context cx, View view,
int xOff, int yOff, int anim) {
// 弹出动画
mPopupWindow.setAnimationStyle(anim);

// 弹出PopupWindow时让后面的界面变暗
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =0.5f;
((Activity) cx).getWindow().setAttributes(parms);

int[] positon = new int[2];
view.getLocationOnScreen(positon);
// 弹窗的出现位置,在指定view之下
mPopupWindow.showAsDropDown(view, positon[0] + xOff, positon[1] + yOff);
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// PopupWindow消失后让后面的界面变亮
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =1.0f;
((Activity) cx).getWindow().setAttributes(parms);

if (mListener != null) {
mListener.dissmiss();
}
}
});

return mPopupWindow;
}

private interface OnDissmissListener{

void dissmiss();

}

private OnDissmissListener mListener;

public void setOnDissmissListener(OnDissmissListener listener) {
mListener = listener;
}
}`

推荐阅读
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文详细介绍了`android.os.Binder.getCallingPid()`方法的功能和应用场景,并提供了多个实际的代码示例。通过这些示例,开发者可以更好地理解如何在不同的开发场景中使用该方法。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了在使用JavaMail发送电子邮件时,抄送功能未能正常工作的问题,并提供了详细的代码示例和解决方法。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
author-avatar
oDavid_仔o_880
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有