项目回顾-PopupWindow

右上菜单,可以通过 重写 onCreateOptionsMenu指定 menu, 重写 onOptionsItemSelected 来响应点击事件

不过 这个菜单在某些手机上弹出的有点卡顿,而且如果不对主题进行设置,会从actionbar 上直接弹出,而不是下面

如果想从下面弹出,要先添加一个style

    <style name="MenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow"><item name="overlapAnchor">false</item></style>

之后在activity引用的主题中添加一行  就行了

 <item name="actionOverflowMenuStyle">@style/MenuStyle</item>

 

Menu在没有特别要求的情况还是很好用的,但是如果要求比较复杂的时候就不如用PopupWindow了

要实现如图的效果

 

 先拿到从美工拿到的图片  

 

打开sdk的 tools文件夹   打开 draw9patch.bat  把图片拖进去

画黑边   左上两个方向的黑边 表示拉伸部分

右下表示布局中控件内容显示的区域

如果画错了 按住shift 抹掉

完成之后save

 

 

布局

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3               android:layout_width="wrap_content"
  4               android:layout_height="wrap_content"
  5               android:background="@drawable/pop_bg_shadow9"
  6               android:gravity="center_horizontal"
  7               android:orientation="vertical"
  8     >
  9 
 10     <LinearLayout
 11         android:id="@+id/ll_action_config"
 12         android:layout_width="match_parent"
 13         android:layout_height="wrap_content"
 14         android:gravity="center_vertical"
 15         android:orientation="horizontal"
 16         android:padding="10dp"
 17         >
 18 
 19         <ImageView
 20             android:layout_width="25dp"
 21             android:layout_height="25dp"
 22             android:src="@drawable/pop_setting"/>
 23 
 24         <TextView
 25             android:layout_width="wrap_content"
 26             android:layout_height="wrap_content"
 27             android:paddingLeft="15dp"
 28             android:text="关联配置"
 29             android:textColor="@color/white"/>
 30 
 31     </LinearLayout>
 32 
 33     <LinearLayout
 34         android:id="@+id/ll_action_history"
 35         android:layout_width="match_parent"
 36         android:layout_height="wrap_content"
 37         android:gravity="center_vertical"
 38         android:orientation="horizontal"
 39         android:padding="10dp"
 40         >
 41 
 42         <ImageView
 43             android:layout_width="25dp"
 44             android:layout_height="25dp"
 45             android:src="@drawable/pop_history"/>
 46 
 47         <TextView
 48             android:layout_width="wrap_content"
 49             android:layout_height="wrap_content"
 50             android:paddingLeft="15dp"
 51             android:text="历史记录"
 52             android:textColor="@color/white"/>
 53 
 54     </LinearLayout>
 55 
 56     <LinearLayout
 57         android:id="@+id/ll_action_ip"
 58         android:layout_width="match_parent"
 59         android:layout_height="wrap_content"
 60         android:gravity="center_vertical"
 61         android:orientation="horizontal"
 62         android:padding="10dp"
 63         >
 64 
 65         <ImageView
 66             android:layout_width="25dp"
 67             android:layout_height="25dp"
 68             android:src="@drawable/pop_ip"/>
 69 
 70         <TextView
 71             android:layout_width="wrap_content"
 72             android:layout_height="wrap_content"
 73             android:paddingLeft="15dp"
 74             android:text="IP地址"
 75             android:textColor="@color/white"/>
 76 
 77     </LinearLayout>
 78 
 79     <LinearLayout
 80         android:id="@+id/ll_action_about"
 81         android:layout_width="match_parent"
 82         android:layout_height="wrap_content"
 83         android:gravity="center_vertical"
 84         android:orientation="horizontal"
 85         android:padding="10dp"
 86         >
 87 
 88         <ImageView
 89             android:layout_width="25dp"
 90             android:layout_height="25dp"
 91             android:src="@drawable/pop_about"/>
 92 
 93         <TextView
 94             android:layout_width="wrap_content"
 95             android:layout_height="wrap_content"
 96             android:paddingLeft="15dp"
 97             android:text="关于"
 98             android:textColor="@color/white"/>
 99 
100     </LinearLayout>
101 </LinearLayout>
View Code

 

现在要实现点击 右上菜单 弹出 这个布局,同时菜单的图标会变换。

 

在menu目录 新建一个xml    默认icon是 more_close

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/action_menu"android:icon="@drawable/more_close"android:title="菜单"app:showAsAction="always"></item>
</menu>

 

回到activity

    @Overridepublic boolean onCreateOptionsMenu(Menu menu) {this.menu = menu;getMenuInflater().inflate(R.menu.face, menu);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.action_menu:View view=findViewById(R.id.action_menu);showActionMenuPopup(view);break;}return super.onOptionsItemSelected(item);}

 

红色部分都是关键部分

先看  showActionMenuPopup  这个弹出菜单的方法 

 

首先要改变菜单的图标

menu.getItem(0).setIcon(getResources().getDrawable(R.drawable.more_open));

这个menu是 全局的

private Menu menu;

在 onCreateOptionsMenu 中 把这个menu初始化

 

之后 设置 PopupWindow 

 1         View view=LayoutInflater.from(this).inflate(R.layout.popup_actionmenu,null);
 2         actionmenupopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
 3         actionmenupopupWindow.setContentView(view);
 4 
 5         view.findViewById(R.id.ll_action_config).setOnClickListener(this);
 6         view.findViewById(R.id.ll_action_history).setOnClickListener(this);
 7         view.findViewById(R.id.ll_action_ip).setOnClickListener(this);
 8         view.findViewById(R.id.ll_action_about).setOnClickListener(this);
 9 
10         actionmenupopupWindow.setFocusable(true);
11         actionmenupopupWindow.setBackgroundDrawable(new BitmapDrawable());
12 
13         actionmenupopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
14             @Override
15             public void onDismiss() {
16                 menu.getItem(0).setIcon(getResources().getDrawable(R.drawable.more_close));
17             }
18         });
19 
20         actionmenupopupWindow.showAsDropDown(v);

 

5-8  设置弹出菜单的点击事件

11  点击PopupWindow之外的地方PopupWindow消失

13-18  监听PopupWindow消失  改变菜单图标

20  showAsDropDown  从下方出现   肯定要是一个view的, 回到onOptionsItemSelected  找到右上菜单的view  传入了方法中,最后在这里使用

 

还有一个显示方法   直接指定位置,不过要测量出状态栏和actionbar的高度

actionmenupopupWindow.showAtLocation(findViewById(R.id.action_menu),Gravity.RIGHT|Gravity.TOP ,0, getStatusBarHeight(this)+getSupportActionBar().getHeight());

 

 

IOS有一个底部菜单控件 UIActionSheet

安卓方面想实现这个  有第三方的 ActionSheet    有 谷歌官方的design包  BottomSheet

用PopupWindow 也可以实现

 

rootview = LayoutInflater.from(this).inflate(R.layout.activity_main,null);

 

 1         View view= LayoutInflater.from(this).inflate(R.layout.popup_camera_sel,null);
 2         bottompopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
 3 
 4         bottompopupWindow.setContentView(view);
 5 
 6         view.findViewById(R.id.ll_gallery).setOnClickListener(this);
 7         view.findViewById(R.id.ll_camera).setOnClickListener(this);
 8         view.findViewById(R.id.ll_cancle).setOnClickListener(this);
 9 
10         WindowManager.LayoutParams lp = getWindow().getAttributes();
11         lp.alpha = 0.6f;
12         getWindow().setAttributes(lp);
13 
14         bottompopupWindow.setFocusable(true);
15         bottompopupWindow.setBackgroundDrawable(new BitmapDrawable());
16         bottompopupWindow.setAnimationStyle(R.style.mypopwindow_anim_style);
17 
18         bottompopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
19             @Override
20             public void onDismiss() {
21                 WindowManager.LayoutParams lp = getWindow().getAttributes();
22                 lp.alpha = 1f;
23                 getWindow().setAttributes(lp);
24             }
25         });
26         bottompopupWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);

 

10-12   18-25   改变屏幕的透明度

 

style      从底部升上来 降下去的动画 

    <style name="mypopwindow_anim_style"><item name="android:windowEnterAnimation">@anim/popshow_anim</item><!-- 指定显示的动画xml --><item name="android:windowExitAnimation">@anim/pophidden_anim</item><!-- 指定消失的动画xml --></style>

show

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="500"android:fromYDelta="50%p"android:toYDelta="0" />
</set>

hide

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="500"android:fromYDelta="0"android:toYDelta="50%p" />
</set>

 

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:orientation="vertical"android:gravity="center"><LinearLayoutandroid:id="@+id/ll_gallery"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="相册"android:textColor="#333333"android:textSize="20sp"/></LinearLayout><!--<TextView--><!--android:layout_width="200dp"--><!--android:layout_height="1dp"--><!--android:background="#838B8B"--><!--/>--><ImageViewandroid:src="@drawable/line_pop"android:scaleType="centerCrop"android:layout_width="match_parent"android:layout_height="wrap_content"/><LinearLayoutandroid:id="@+id/ll_camera"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="相机"android:textColor="#333333"android:textSize="20sp"/></LinearLayout><!--<TextView--><!--android:layout_width="200dp"--><!--android:layout_height="1dp"--><!--android:background="#838B8B"--><!--/>--><ImageViewandroid:src="@drawable/line_pop"android:scaleType="centerCrop"android:layout_width="match_parent"android:layout_height="wrap_content"/><LinearLayoutandroid:id="@+id/ll_cancle"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消"android:textSize="20sp"/></LinearLayout></LinearLayout>
View Code

 

 

 

 

最后 记得响应完点击事件之后  dismiss 关闭PopupWindow

 

转载于:https://www.cnblogs.com/demon9/p/6021980.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt android glsl,基于Qt的OpenGL学习(1)—— Hello Triangle

简介要学习OpenGL的话&#xff0c;强烈安利这个教程JoeyDeVries的learnopengl&#xff0c;这里是中文翻译好的版本。教程中使用OpenGL是通过GLFW这个库&#xff0c;而在Qt中对OpenGL封装得很好&#xff0c;并且和GUI以及IO相关的处理Qt更便捷&#xff0c;学习起来更轻松。这里就…

解决:Not Found: /favicon.ico

直接说解决办法&#xff1a; &#xff08;1&#xff09;制作一个 favicon.ico图标放在<head></head>标签中 <link rel"shortcut icon" href"xxxxxxxxxx.ico" type"image/x-icon" /> <!--制作的图标&#xff0c;使用hr…

多态方法调用的解析和分派

方法调用并不等同于方法执行&#xff0c;方法调用阶段唯一的任务就是确定被调用方法的版本&#xff08;即调用哪一个方法&#xff09;&#xff0c;暂时还不涉及方法内部的具体运行过程。在程序运行时&#xff0c;进行方法调用是最普遍、最频繁的操作&#xff0c;Class文件的编译…

关于用VS写C程序运行时出现烫字以及乱码的问题的原因

最近在复习C语言写程序时&#xff0c;突然碰到标题上的这种情况&#xff0c;后来经过上网查找以及逐步调试才发现原来是在打印数组的时候“越界”导致的&#xff0c;因为程序在默认初始化char类型的数组时&#xff0c;初始化的值是“烫”字&#xff0c;一般情况下是字符串未初始…

ARM TK1 安装kinect驱动

首先安装usb库 $ git clone https://github.com/libusb/libusb.git 编译libusb需要的工具 $ sudo apt-get install autoconf autogen $ sudo apt-get install libtool $ sudo apt-get install libudev* 编译安装 $ sudo ./autogen.sh $ sudo make $ sudo make install $ sudo l…

大数据入门:各种大数据技术的介绍

大数据我们都知道hadoop&#xff0c;可是还会各种各样的技术进入我们的视野&#xff1a;Spark&#xff0c;Storm&#xff0c;impala&#xff0c;让我们都反映不过来。为了能够更好的架构大数据项目&#xff0c;这里整理一下&#xff0c;供技术人员&#xff0c;项目经理&#xf…

安装安全类软件进行了android签名漏洞修补,魅族MX3怎么升级固件体验最新比较稳定的版本...

魅族mx3固件怎么升级?flyme os系统会持续更新&#xff0c;升级魅族MX3手机系统需先下载MX3的升级固件&#xff0c;升级固件分为体验版和稳定版。魅族MX3固件有体验版和稳定版两种&#xff0c;顾名思义&#xff0c;体验版为最新版但相比稳定版来说存在更多的漏洞&#xff0c;升…

ubuntu入门知识

1、linux系统发展历史 unix -> Linux -> ubuntu linux发展轨迹图 2、ubuntu下载和安装 推荐使用长期支持版本&#xff1a; 10.04,12.04,14.04或LTS版本 安装环境VMware虚拟机 3、安装之后创建root sudo passwd root 输入root用户密码即可 4、安装软件&#xff1a; 更新软…

Vim的基本操作总结

最近在学习Linux基础的时候&#xff0c;对Vim的基本操作时遇到很多问题&#xff0c;如编辑错误&#xff0c;无法退出Vim等。通过一系列的学习后才解决了这些问题&#xff0c;希望这个过程能对后来者有所帮助 先对Vim的三种模式做个大致的介绍&#xff1a; Vi有三种基本工作模式…

11月14号站立会议(从即日14号起到24号截至为final阶段工作期)

小组名称&#xff1a;飞天小女警 项目名称&#xff1a;礼物挑选小工具 小组成员&#xff1a;沈柏杉&#xff08;组长&#xff09;、程媛媛、杨钰宁、谭力铭 代码地址&#xff1a;HTTPS:https://git.coding.net/shenbaishan/GIFT.git SSH&#xff1a;gitgit.coding.net:shenbais…

初学大数据之模块集成:Pycharm安装numpy,scipy,sklearn等包时遇到的各种问题的一键解决方法

最近在学习机器学习&#xff0c;要用Python写程序&#xff0c;习惯了用IDE软件&#xff0c;所以就使用Pycharm软件。但是在导入类似numpy,sklearn等模块的时候&#xff0c;发现了各种问题&#xff08;如Python版本与模块之间的兼容等各类问题&#xff09;,上网找了许多方法&…

html 圆环实现多种颜色,SVG实现多彩圆环倒计时效果的示例代码

圆环倒计时我们经常见到&#xff0c;实现的方法也有很多种。但是本文将介绍一种全新的实现方式&#xff0c;使用SVG来实现倒计时功能。本文主要用到了SVG的stroke-dasharray和stroke-dashoffset特性。下图是倒计时运行效果&#xff1a;SVG倒计时案例下面说说相关的实现代码。cs…

初学大数据之Python中5个最佳的数据科学库的学习

在下载了pycharm软件以及通过前两篇文章&#xff0c;配置了相应的模块包之后&#xff0c;那就开始对常用的模块的学习&#xff0c;以便后期利用这些模块对数据做模型化处理。 如果你已经决定把Python作为你的编程语言&#xff0c;那么&#xff0c;你脑海中的下一个问题会是&…

模拟银行自动提款系统python

列出对象及属性名称行为...py 人 类名&#xff1a;Person 属性&#xff1a;姓名 身份证号 电话 卡 行为&#xff1a;卡 类名&#xff1a;Card 属性&#xff1a;卡号 密码 余额 行为&#xff1a;银行 类名&#xff1a;Bank 属性&#xff1a;用户列表 提款机提款机 类名&#xf…

sklearn中常用的数据预处理方法

常见的数据预处理方法&#xff0c;以下通过sklearn的preprocessing模块来介绍; 1. 标准化&#xff08;Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值&#xff0c;单位方差。也叫z-score规范化&#xff08;零均值规范化&#xff09;。计算方式是…

SharePoint Server 2016 PWA(Project web app) 被变为只读模式

今天有同事反应了一个状况&#xff0c;我们SharePoint 2016里面集成的Project Web App(以下简称PWA)变成 read-only 只读模式了&#xff01;今天就给大家分享一下我的排查过程&#xff0c;供大家参考。 整个过程我一共使用了五种办法&#xff0c;结果最后一种才生效&#xff0c…

集成学习之参数调整策略

1 Random Forest和Gradient Tree Boosting参数详解 在sklearn.ensemble库中&#xff0c;我们可以找到Random Forest分类和回归的实现&#xff1a;RandomForestClassifier和RandomForestRegression&#xff0c;Gradient Tree Boosting分类和回归的实现&#xff1a;GradientBoost…

Random Forest算法中的参数详解

本篇不是介绍RF的&#xff0c;关于RF网上有很多通俗易懂的解释 西瓜书与统计学习方法等很多教材中的解释也都足够 本篇仅针对如何使用sklearn中的RandomForestClassifier作记录 一、代码怎么写 [python] view plaincopy print?class sklearn.ensemble.RandomForestClassifier(…

给未来的自己一封信计算机,给未来的自己的一封信范文(精选5篇)

给未来的自己的一封信范文(精选5篇)在日常生活或是工作学习中&#xff0c;大家总免不了要接触或使用书信吧&#xff0c;书信一般包括称呼、问候语、正文、祝语、署名、日期六个部分。你知道书信怎样写才规范吗&#xff1f;下面是小编为大家收集的给未来的自己的一封信范文(精选…

GBDT算法简介

在网上看到一篇GBDT介绍非常好的文章&#xff0c;GBDT大概是非常好用又非常好用的算法之一了吧(哈哈 两个好的意思不一样) GBDT(Gradient Boosting Decision Tree) 又叫 MART&#xff08;Multiple Additive Regression Tree)&#xff0c;是一种迭代的决策树算法&#xff0c;该算…