PopUpWindow

PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作,但它与Dialog又有很大的区别,PopupWindow只是弹出窗口,不会使宿主Activity组件失去焦点,也就是说PopupWindow弹出后,你仍可以与宿主Activity进行交互,Dialog却不能做到这一点。

 

本章我将介绍的是一个自定义的PopupWindow,它实现的效果是固定显示在一定大小的区域内,并根据点击按钮的位置来显示箭头,用于指示当前选中的按钮,并自定义其布局,对布局中组件进行相应的监听,相应相应的操作,而且自定义其弹出和淡去的动画效果,弹出:自左向右滑动淡入,淡出:自右向左淡出。效果图如下:

 

图1:

ithouge_PopUpWindow 

 

图2

ithouge_popupwindow 

 

如图,当点击左侧的的按钮时,其箭头指向当前按钮,并点击相应的按钮color、Sort、Save、Cancel、Delete等响应响应的动作。以下是实现的部分核心代码:

 

复制代码
  1 public class QuickActionWindow extends PopupWindow implements 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent.1.5.0/docs/api/javax/security/auth/callback/Callback.html">Callback,OnClickListener,OnColorChangedListener{
2 private static final 1.5.0/docs/api/java/lang/String.html">String THIS_FILE = "QuickActionWindow";
3 private final 5+0%2Fdocs%2Fapi+Context">Context mContext;
4 private final LayoutInflater mInflater;
5 private final WindowManager mWindowManager;
6
7 1.5.0/docs/api/javax/swing/text/View.html">View contentView;
8
9 private int mScreenWidth;
10 private int mScreenHeight;
11
12 private int mShadowHoriz,nine,Hundred;
13 // private int mShadowVert;
14 // private int mShadowTouch;
15
16 private 1.5.0/docs/api/javax/swing/text/html/ImageView.html">ImageView mArrowUp;
17 private 1.5.0/docs/api/javax/swing/text/html/ImageView.html">ImageView mArrowDown;
18
19 private EditText catName;
20 private 1.5.0/docs/api/java/awt/Button.html">Button yesButton,cancelButton,deleteButton,colorButton,sortButton;
21 private int marginTop;
22 private int colorGiga=1.5.0/docs/api/java/awt/Color.html">Color.RED;
23 private Contants appState;
24 private 1.5.0/docs/api/java/lang/String.html">String nameStr,tag_str="";
25 private int popUpWidth,popUpHeight;
26
27 /*
28 * private View mHeader; private HorizontalScrollView mTrackScroll;
29 */
30 private ViewGroup mTrack;
31
32 /*
33 * private View mFooter; private View mFooterDisambig; private ListView
34 * mResolveList; private CheckBox mSetPrimaryCheckBox;
35 */
36
37 private 1.5.0/docs/api/javax/swing/text/View.html">View mPView;
38 private Rect mAnchor,listAnchor;
39
40 // context为传入的上下文,pView为对应的父级得视图
41 public QuickActionWindow(5+0%2Fdocs%2Fapi+Context">Context context, 1.5.0/docs/api/javax/swing/text/View.html">View pView,1.5.0/docs/api/java/lang/String.html">String name,Rect rect,Rect listRect) {
42 super(context);
43
44 mPView = pView;
45 nameStr=name;
46
47 mAnchor = rect;
48 listAnchor=listRect;
49
50 marginTop=listAnchor.top;
51
52 if(!nameStr.equals("")){ // 如果传入的名称不为空,则为修改Tag
53 tag_str=mPView.getTag().toString();
54 }
55
56 mContext = context;
57 appState=(Contants) mContext.getApplicationContext();
58 mWindowManager = (WindowManager) mContext.getSystemService(5+0%2Fdocs%2Fapi+Context">Context.WINDOW_SERVICE);
59 mInflater = ((Activity) mContext).getLayoutInflater();
60
61 setContentView(R.layout.quickaction);
62
63 mScreenWidth = mWindowManager.getDefaultDisplay().getWidth();//获取屏幕的宽度
64 mScreenHeight = mWindowManager.getDefaultDisplay().getHeight();
65
66 setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
67
68 final Resources res = mContext.getResources();
69 mShadowHoriz = res.getDimensionPixelSize(R.dimen.quickaction_shadow_horiz);// 0dip
70 nine=res.getDimensionPixelSize(R.dimen.quickaction_nine);// 9dip
71 Hundred=res.getDimensionPixelSize(R.dimen.quickaction_one_Hundred);// 100dip
72
73 setWidth(mScreenWidth-listAnchor.left+nine);// 设置PopupWindow的宽度
74 setHeight(listAnchor.bottom-listAnchor.top);
75
76 setBackgroundDrawable(new ColorDrawable(0));
77
78 mArrowUp = (1.5.0/docs/api/javax/swing/text/html/ImageView.html">ImageView) contentView.findViewById(R.id.arrow_up);
79 mArrowDown = (1.5.0/docs/api/javax/swing/text/html/ImageView.html">ImageView) contentView.findViewById(R.id.arrow_down);
80
81 mTrack = (ViewGroup) contentView.findViewById(R.id.quickaction);//中间
82
83 catName=(EditText) contentView.findViewById(R.id.cat_name);// Tag名称
84 catName.setText(nameStr);
85 // catName.setText(title);
86 yesButton = (1.5.0/docs/api/java/awt/Button.html">Button) contentView.findViewById(R.id.cat_save);// Save Button
87 yesButton.setOnClickListener(this);
88
89 cancelButton = (1.5.0/docs/api/java/awt/Button.html">Button) contentView.findViewById(R.id.cat_cancel); // Cancel Button
90 cancelButton.setOnClickListener(this);
91
92 deleteButton=(1.5.0/docs/api/java/awt/Button.html">Button) contentView.findViewById(R.id.cat_delete); // Delete Button
93 deleteButton.setOnClickListener(this);
94 if(tag_str.equals("1")||tag_str.equals("2") || nameStr.equals("")){// 如果tag_id为1或2,则表明为All、Favorite
95 deleteButton.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.GONE);
96 }else{
97 deleteButton.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.VISIBLE);
98 }
99 colorButton=(1.5.0/docs/api/java/awt/Button.html">Button) contentView.findViewById(R.id.cat_color); // Color Button
100 colorButton.setOnClickListener(this);
101
102 sortButton=(1.5.0/docs/api/java/awt/Button.html">Button) contentView.findViewById(R.id.cat_sort); // Sort Button
103 sortButton.setOnClickListener(this);
104 if(nameStr.equals("")){ // 如果传入的tag名称为空,则表明为新建Tag
105 sortButton.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.GONE);
106 }else{
107 sortButton.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.VISIBLE);
108 }
109
110 /*
111 * mTrackScroll = (HorizontalScrollView)
112 * contentView.findViewById(R.id.scroll);
113 *
114 * mFooter = contentView.findViewById(R.id.footer); mFooterDisambig =
115 * contentView.findViewById(R.id.footer_disambig); mResolveList =
116 * (ListView) contentView.findViewById(android.R.id.list);
117 * mSetPrimaryCheckBox = (CheckBox)
118 * contentView.findViewById(android.R.id.checkbox);
119 */
120
121 setFocusable(true);//是否可以获取焦点
122 setTouchable(true);// 是否可以触摸
123 setOutsideTouchable(true);
124
125 }
126
127 private void setContentView(int resId) {
128 contentView = mInflater.inflate(resId, null);
129 super.setContentView(contentView);
130 }
131
132 /**
133 * Show the correct call-out arrow based on a {@link R.id} reference.
134 */
135 private void showArrow(int whichArrow, int requestedX) {
136 final 1.5.0/docs/api/javax/swing/text/View.html">View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;
137 final 1.5.0/docs/api/javax/swing/text/View.html">View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;
138
139 // Dirty hack to get width, might cause memory leak
140 final int arrowHeight = mContext.getResources().getDrawable(R.drawable.quickaction_arrow_up).getIntrinsicHeight();
141
142 showArrow.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.VISIBLE);
143 ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) showArrow.getLayoutParams();
144 param.topMargin = requestedX - arrowHeight/2; // 设置箭头的 margin_top,它的值为 Button的中心点的y - 箭头高度二分之一
145 // Log.d("QuickActionWindow",
146 // "ArrowWidth: "+arrowWidth+"; LeftMargin for Arrow: "+param.leftMargin);
147
148 hideArrow.setVisibility(1.5.0/docs/api/javax/swing/text/View.html">View.INVISIBLE);
149 }
150
151 public boolean onKeyUp(int keyCode, 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent event) {
152 if (keyCode == 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent.KEYCODE_BACK) {
153 onBackPressed();
154 return true;
155 }
156
157 return false;
158 }
159
160 private void onBackPressed() {
161 dismiss();
162 }
163
164 public boolean onKeyDown(int keyCode, 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent event) {
165 return false;
166 }
167
168 public boolean onKeyMultiple(int keyCode, int count, 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent event) {
169 return false;
170 }
复制代码
复制代码
  1 public void show() {
2 show(mAnchor.centerY());
3 }
4
5 public void show(int requestedX) {// 传入Button的中心点的y方向坐标
6 if(mAnchor == null) {
7 return;
8 }
9 super.showAtLocation(mPView, Gravity.NO_GRAVITY, 0, 0);
10
11 // Calculate properly to position the popup the correctly based on
12 // height of popup
13 if (isShowing()) {
14 int x, y, windowAnimations;
15 this.getContentView().measure(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);// 设置popUp的content的width 和height ?
16 final int blockWidth = this.getContentView().getMeasuredWidth();// 取得popUp的width
17
18 y = mShadowHoriz+marginTop;// 0
19
20 if (mAnchor.left > blockWidth) {//如果当前按钮的上方有足够的空间可以放下PopupWindow时,则将PopUpWindow放在上方。
21 // Show downwards callout when enough room, aligning bottom
22 // block
23 // edge with top of anchor area, and adjusting to inset arrow.
24 showArrow(R.id.arrow_down, requestedX-marginTop+mShadowHoriz);
25 x = mAnchor.left - blockWidth+nine;
26 windowAnimations = R.style.QuickActionRightAnimation;
27 } else {
28 // Otherwise show upwards callout, aligning block top with
29 // bottom of
30 // anchor area, and adjusting to inset arrow.
31 showArrow(R.id.arrow_up, requestedX-marginTop+mShadowHoriz);//显示箭头的位置
32 x = mAnchor.right-nine;
33 windowAnimations = R.style.QuickActionLeftAnimation;
34 }
35
36 setAnimationStyle(windowAnimations);
37 Log.i("selector", x+"--"+y);
38 this.update(x, y, -1, -1);
39 }
40 }
41
42 @1.5.0/docs/api/java/lang/Override.html">Override
43 public boolean onKeyLongPress(int keyCode, 1.5.0/docs/api/java/awt/event/KeyEvent.html">KeyEvent event) {
44 return false;
45 }
46
47 public void removeAllItems() {
48 mTrack.removeViews(1, mTrack.getChildCount()-2);
49 }
50
51 @1.5.0/docs/api/java/lang/Override.html">Override
52 public void onClick(1.5.0/docs/api/javax/swing/text/View.html">View v) {
53 // TODO Auto-generated method stub
54 int view_id = v.getId();
55 switch (view_id) {
56 case R.id.cat_save:{
57 ContentValues values=new ContentValues();
58 values.put(tagsInfo.TAG_NAME,catName.getText().toString());
59 values.put(tagsInfo.TAG_COLOUR,colorGiga);
60
61 if(nameStr.equals("")){ // 如果传入的title为空,则为新增加Tag
62 int orderId=appState.prefsDevice.getPreferenceIntValue(DBAdapter.TAG_COUNT);
63 values.put(tagsInfo.TAG_ORDER_INDEX,orderId++);
64 appState.db.insertTag(values);
65 appState.prefsDevice.setPreferenceFloatValue(DBAdapter.TAG_COUNT, orderId++);
66 }else{ // 如果传入的title不为空,则为修改tag
67 appState.db.updateTag(values,tag_str);
68 }
69 Intent publishIntent = new Intent(SipManager.ACTION_GIGATALK_TAG_CHANGED);
70 mContext.sendBroadcast(publishIntent);
71 this.dismiss();
72 break;
73 }
74 case R.id.cat_cancel:{
75 this.dismiss();
76 break;
77 }
78 case R.id.cat_delete:{
79 appState.db.deleteTagById(tag_str);
80 Intent publishIntent = new Intent(SipManager.ACTION_GIGATALK_TAG_CHANGED);
81 mContext.sendBroadcast(publishIntent);
82 this.dismiss();
83 break;
84 }
85 case R.id.cat_color:{
86 new ColorPickerDialog(mContext,this,1.5.0/docs/api/java/awt/Color.html">Color.RED).show();
87 break;
88 }
89 case R.id.cat_sort:{
90 Intent intent=new Intent(mContext,DragDemo.class);
91 mContext.startActivity(intent);
92 this.dismiss();
93 break;
94 }
95
96 }
97 }
98 /**
99 * 回调函数,获取选择颜色
100 */
101 @1.5.0/docs/api/java/lang/Override.html">Override
102 public void colorChanged(int color) {
103 // TODO Auto-generated method stub
104 colorGiga=color;
105 }
106 }
复制代码

 如上代码关键在于继承了PopupWindow,难点在于确定箭头和PopupWindow的位置,以及PopupWindow的大小和布局。使用方法是实现该类,并传入相应的参数:

 

复制代码
 1 int[] xy = new int[2];
2 v.getLocationInWindow(xy);
3 Rect r = new Rect(xy[0], xy[1], xy[0] + v.getWidth(), xy[1] + v.getHeight());
4
5 int[] listxy=new int[2];
6 searchList.getLocationInWindow(listxy);
7 Rect listr = new Rect(listxy[0], listxy[1], listxy[0] + searchList.getWidth(), listxy[1] + searchList.getHeight());
8
9 QuickActionWindow quickAction = new QuickActionWindow(v.getContext(),v,title,r,listr);
10
11 quickAction.show();
复制代码

原文链接:           

            http://bg135.com/popupwindow.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的课程作业管理系,源码+数据库+开题报告+论文答辩+毕业论文+视频演示 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结,得出系统中存在的不足及需要改进的地方,为以后的系统维护提供了方便,同时也为今后开发类似系统提供了借鉴和帮助。这种个性化的网上管理系统特别注重交互协调与管理的相互配合,激发了管理人员的创造性与主动性,对课程作业管理系统而言非常有利。 本课程作业管理系统采用的数据库是Mysql,使用springboot框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 1、关于课程作业管理系统的基本要求: (1)功能要求:可以管理首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理等功能模块。 (2)性能:在不同操作系统上均能无差错实现在不同类型的用户登入相应界面后能不出差错、方便地进行预期操作。 (3)安全与保密要求:用户都必须通过注册、登录才能进入系统,并且用户的权限也需要根据用户的类型进行限定。 (4)环境要求:支持多种平台,可在Windows系列、Vista系统等多种操作系统下使用。 关键词:课程作业管理系统,springboot框架; Mysql数据库 Java技术
毕业设计,基于SpringBoot+Vue+MySQL开发的旅游网站,源码+数据库+开题报告+论文答辩+毕业论文+视频演示 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变低了,还提升了旅游网站的灵活性。这种个性化的旅游网站特别注重交互协调经营与管理的相互配合,激发了管理人员的创造性与主动性,对旅游管理的管理而言非常有利。 本文首先分析了旅游网站的发展背景和意义,简要阐述了旅游网站系统开发的主要内容和优势,然后简要介绍了国内外旅游网站系统的研究和应用现状,并对系统开发技术,系统分析和总体设计,实现详细功能等。 本旅游网站系统采用的数据库是MySQL,使用Java技术开发,在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 关键词:旅游网站;Java;SpringBoot; Vue; MySQL 数据库 旅游网站主要功能如下: 1.用户管理:注册、登录、退出、修改密码; 2.分类显示:显示旅游路线的分类; 3.旅游路线显示:按分类查询旅游路线、通过关键字搜索旅游路线、查看旅游路线的详细信息; 4.购物车管理:向购物车中添加旅游路线、修改购物车中旅游路线数量、删除购物车中旅游路线、我的购物车; 5.订单管理:通过购物车中生成订单、查看我的订单、查看某个订单的详细、订单支付、取消未付款订单。 6.首页:提供一个网站首页,该网站用户的登录,注册,所有旅游路线的一级分类,热门旅游路线和最新旅游路线的展示等。 7.旅游路线管理:旅游路线的上架、下架。
嗨!对于你关于 Android PopupWindow 的问题,我可以给你一些基本的信息。PopupWindow 是 Android 中的一个弹出式窗口,它可以覆盖在其他视图之上,提供一种临时性的用户界面。你可以使用 PopupWindow 来显示额外的内容、菜单或者交互提示。 要创建一个 PopupWindow,首先你需要实例化一个 PopupWindow 对象,并为其设置一些基本属性,例如宽度、高度、背景等。然后,你可以将任何视图或布局添加到 PopupWindow 中,并通过设置位置参数来控制它的显示位置。 下面是一个简单的示例代码,展示如何创建和显示一个 PopupWindow: ```java // 创建一个 PopupWindow 对象 PopupWindow popupWindow = new PopupWindow(context); // 设置 PopupWindow 的宽度和高度 popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); // 设置 PopupWindow 的内容视图 View contentView = LayoutInflater.from(context).inflate(R.layout.popup_layout, null); popupWindow.setContentView(contentView); // 设置 PopupWindow 的背景 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // 显示 PopupWindow popupWindow.showAtLocation(anchorView, Gravity.CENTER, 0, 0); ``` 在上面的示例中,我们创建了一个 PopupWindow 对象,并设置了宽度和高度为包裹内容。然后,我们通过调用 `setContentView` 方法将一个自定义的布局文件 `R.layout.popup_layout` 添加到 PopupWindow 中。最后,我们使用 `showAtLocation` 方法将 PopupWindow 显示在屏幕中央。 希望这些信息对你有帮助!如果你对 PopupWindow 有更多的问题,或者需要更详细的示例代码,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值