最近写程序第一次用到了PopupWindow,便简单了学习了一下。特此记下自己的收获。PopupWindow是一种悬浮框,比AlertDialog要灵活的多。先简单了实现一个PopWindow的效果,然后再一下相应的总结吧。因为有些东西,如果没有代码的话是很难说的清楚的。先说明,PopupWindow是位于android.widget.PopupWindow包下面的,方便你查看源码。

一、简单实现一个PopupWindow

先看一个实现的效果图吧。如下:

效果说明:最底部就是一个PopupWindow,只要点击popWindow按钮,就会从底部的位置弹出来。下面我们就开始写代码吧。

新建项目,然后修改它的activity_main.xml,代码如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bgd"
android:orientation="vertical"> <TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是PupopWindow的背景"
android:textSize="30sp"
/> -->
<Button
android:id="@+id/btn_reflect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="popWindow"
/> </LinearLayout>

代码超级简单,就不用我说了,然后再为PopupWindow写布局,新建pup.xml,代码如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <Button
android:id="@+id/btn_pop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是按钮"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是PupopWindow"
android:textSize="30sp"/> </LinearLayout>

代码不解释了。接着呢,就是为PopupWindow准备动画了。首先在res下建立文件夹anim。然后再里面新建anim_enter.xml。代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="300"> </translate>

然后再在里面新建anim_exit.xml,代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="100%"
android:duration="300"> </translate>

最后在values文件夹下的styles.xml添加语句:

 <resources>

     <!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style> <!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
<style name="pupopWindow_anim">
<item name="android:windowEnterAnimation">@anim/anim_enter</item>
<item name="android:windowExitAnimation">@anim/anim_exit</item>
</style> </resources>

绿色部分,即第19到22行就是添加的代码。这个style就是为PopupWindow准备的动画了,即进入和退出时的动画。

最后修改MainActiivty的代码,在这里面将PopWindow显示出来即可。代码如下:

 package com.fuly.kun;

 import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast; public class MainActivity extends Activity { private Button btnReflect;
private PopupWindow popWindow; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnReflect = (Button) findViewById(R.id.btn_reflect); btnReflect.setOnClickListener(new OnClickListener() { public void onClick(View v) { showPupopWindow();//显示出popWindow
}
});
} /**
* 将PupopWindow显示出来
*/
private void showPupopWindow() {
//PupopWindow的view
View pupView = LayoutInflater.from(this).inflate(R.layout.pup, null); Button btn = (Button) pupView.findViewById(R.id.btn_pop);
btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(getApplicationContext(), "我是popWindow的按钮", Toast.LENGTH_SHORT).show();
}
}); //实例化PupopWindow,参数中直接为其设置了view以及它的宽和高
popWindow = new PopupWindow(pupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); //设置PupopWindow捕获焦点
popWindow.setFocusable(true); popWindow.setTouchable(true);//设置popWindow可点击 //为popWindow设置背景
ColorDrawable cd = new ColorDrawable(Color.parseColor("#FFFF00"));
popWindow.setBackgroundDrawable(cd); //为popWindow设置进入和退出动画
popWindow.setAnimationStyle(R.style.pupopWindow_anim);
//将popWindwo显示出来
popWindow.showAtLocation(this.findViewById(R.id.tv), Gravity.BOTTOM, 0, 0);
} }

代码注释很详细,逻辑也超级简单。运行程序,就是前面我们贴出来的效果了。

二、总结

总结一下在使用PopWindow时常用的方法吧,更详细的可以翻看API文档。如下:

  • showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
  • showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
  • showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
  • setFocusable(true):设置捕获焦点,默认为false
  • setTouchable(true):设置PopupWindow可点击,默认为true。如果为false,则Touch事件或者点击事件会传递给下面的view,PopupWindow不处理。
  • setOutsideTouchable(true):设置PopWindow的外部区域可点击,默认为false。只有当PopupWindow没有获取焦点且是可点击的,设置这个值才有意义。
  • setTouchInterceptor(new OnTouchListener()):设置PopupWindow监听所有的触摸事件
  • 为PopupWindow设置背景:ColorDrawable cd = new ColorDrawable(Color.parseColor("#FFFF00"));
                          popWindow.setBackgroundDrawable(cd);

  • setAnimationStyle(R.style.pupopWindow_anim):为PopupWindow设置动画(进入动画和退出动画)
  • dismiss():退出

注意事项:

可能会出现问题,点击PupopWindow外部区域无效。此时给PupopWindow设置好背景就可以了。所以为了避免出现问题,一定要给其设置背景,哪怕是透明的。

PopupWindow学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. html5的meta标签

    meta标签中的http-equiv属性使用介绍 meta是html语言head区的一个辅助性标签;meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言等等;感兴趣的朋友可以了解下     ...

  2. [PY3]——求TopN/BtmN 和 排序问题的解决

    需求 K长的序列,求TopN K长的序列,求BtmN 排序问题 解决 heap.nlargest().heap.nsmallest( ) sorted( )+切片 max( ).min( ) 总结和比 ...

  3. Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动

    如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯.因为在Silverlight中的坐标系与Flash中的坐标系一样,一切都的颠倒的.在标准的数学坐标系中,X轴表示水平 ...

  4. Java基础(七)常用类

    一.Math类 1.Math类介绍 Math类属于java.lang包下面,里面包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数,该类被final修饰. 常用字段: 1.E 表示自然 ...

  5. easypoi导出单个sheet和多个sheet

    今天有时间研究了一下easypoi,感觉使用了easypoi导出excel方便了很多,不用写很多复杂的反射,只需要使用注解和一些工具类就可以实现常用的excel的导出,接下来介绍一下easypoi如何 ...

  6. RecyclerView IndexOutOfBoundsException 问题

    在项目中遇到一个RecyclerView 偶现的奔溃,查看日志,发现是: java.lang.IndexOutOfBoundsException: Index: 39, Size: 39 at jav ...

  7. unity3d之控制人物转向移动并播放动画

    tip:transition 勾选Has Exit Time B动画播放完毕后就可以自己返回A不用代码控制.因为想做一个小人静止时 隔两秒会摆动小手的特效. 附上代码参考: using UnityEn ...

  8. Jquery trigger 与 triggerHandler

    secying Jquery trigger与triggerHandler trigger: 在每一个匹配的元素上触发某类事件(即触发jQuery对象集合中每一个元素). 这个函数也会导致浏览器同名的 ...

  9. elastic job 动态设置定时任务

    1. 版本 <!-- import elastic-job lite core --> <dependency> <groupId>com.dangdang< ...

  10. 实现移动端touch事件的横向滑动列表效果

    要实现手机端横向滑动效果并不难,了解实现的原理及业务逻辑就很容易实现.原理:touchstart(手指按下瞬间获取相对于页面的位置)——>touchmove(手指移动多少,元素相应移动多少). ...