android学习笔记---63-PopupWindow,泡泡窗口的实现

转载http://blog.csdn.net/lidew521/article/details/8976627

PopupWindow是一个可以显示在当前Activity之上的浮动容器,PopupWindow弹出的位置是能够改变的,按照有无偏移量,可以分为无偏移和有便宜两种;按照参照对象的不同又可以分为两种:相对某个控件(Anchor锚点)的位置和在父容器内部的相对位置。

创建Android应用:Project Name:PopupWindow,Android2.2,Application Name:泡泡窗口,Packagename:cn.itcast.popwindow,CreateActivity:MainActivity。

1. 界面

在界面上添加按钮,点击后显示Pop窗口。

/PopupWindow/res/values/strings.xml

<?xml version="1.0"encoding="utf-8"?>

<resources>

<string name="hello">Hello World,MainActivity!</string>

<string name="app_name">泡泡窗口</string>

<string name="button">打开泡泡窗口</string>

</resources>

/PopupWindow/res/layout/main.xml

<?xml version="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:id="@+id/main"

>

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button"

android:onClick="openPopWindow"

/>

</LinearLayout>

2. 实现按钮点击方法

创建PopupWIndow:

LayoutInflater mLayoutInflater = (LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);

View contentView = mLayoutInflater.inflate(R.layout.xxx,null); //R.layout.xxx为界面文件

popupWindow = newPopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

popupWindow.setBackgroundDrawable(newBitmapDrawable());

popupWindow.setFocusable(true);//取得焦点,创建出来的PopupWindow默认无焦点

显示PopupWindow的方法:

showAsDropDown(Viewanchor)相对某个控件的位置(正下方),无偏移

showAsDropDown(Viewanchor, int xoff, int yoff)相对某个控件的位置,有偏移,xoff X轴的偏移量,yoff Y轴的偏移量

showAtLocation(Viewparent, int gravity, int x, int y)在父容器的什么位置,gravity为相对位置,如:正中央Gravity.CENTER、下方Gravity.BOTTOM、Gravity.Right|Gravity.BOTTOM右下方等,后面两个参数为x/y轴的偏移量。

关闭PopupWindow:dismiss()

/PopupWindow/src/cn/itcast/popwindow/MainActivity.java

package cn.itcast.popwindow;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.app.Activity;

importandroid.graphics.drawable.BitmapDrawable;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

importandroid.widget.AdapterView.OnItemClickListener;

import android.widget.GridView;

import android.widget.ListAdapter;

import android.widget.PopupWindow;

import android.widget.SimpleAdapter;

public class MainActivity extendsActivity {

PopupWindowpopupWindow;

Viewparent;

privateint[] images ={R.drawable.i1,R.drawable.i2,R.drawable.i3,R.drawable.i4,R.drawable.i5,R.drawable.i6,R.drawable.i7,R.drawable.i8};

privateString[] names = {"搜索", "文件管理", "下载管理", "全屏", "网址", "书签", "加入书签", "分享页面"};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

       ViewcontentView = getLayoutInflater().inflate(R.layout.popwindow, null);

      GridView gridView = (GridView) contentView.findViewById(R.id.gridView);

      gridView.setAdapter(getAdapter());

      gridView.setOnItemClickListener(new ItemClickListener());

       

       popupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

       popupWindow.setFocusable(true);//取得焦点

       popupWindow.setBackgroundDrawable(newBitmapDrawable()); //点击空白的地方关闭PopupWindow

       popupWindow.setAnimationStyle(R.style.animation);

parent =this.findViewById(R.id.main);

}

private final class ItemClickListener implements OnItemClickListener{

publicvoid onItemClick(AdapterView<?> parent, View view, int position, long id){

if(popupWindow.isShowing())popupWindow.dismiss();//关闭

//....

}

}

private ListAdapter getAdapter() {

List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();

for(int i = 0 ; i <images.length ; i++ ){

HashMap<String,Object> item = new HashMap<String, Object>();

item.put("image",images[i]);

item.put("name",names[i]);

data.add(item);

}

SimpleAdaptersimpleAdapter = new SimpleAdapter(this, data, R.layout.grid_item,

newString[]{"image", "name"}, new int[]{R.id.imageView,R.id.textView});

returnsimpleAdapter;

}

publicvoid openPopWindow(Viewv){

       popupWindow.showAtLocation(parent,Gravity.BOTTOM, 0, 0);

}

}

3. 弹出窗口

/PopupWindow/res/layout/popwindow.xml

<?xml version="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:background="@drawable/bg"

>

<GridView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:numColumns="4"

android:horizontalSpacing="10dp"

android:verticalSpacing="10dp"

android:id="@+id/gridView"

/>

</LinearLayout>

/PopupWindow/res/drawable/bg.xml

<?xml version="1.0"encoding="utf-8"?>

<shape

xmlns:android="http://schemas.android.com/apk/res/android"

android:shape="rectangle">

<gradient

android:angle="270"

android:endColor="#1DC9CD"

android:startColor="#A2E0FB"/>

<padding

android:left="2dp"

android:top="2dp"

android:right="2dp"

android:bottom="2dp" />

</shape>

GridView:

/PopupWindow/res/layout/grid_item.xml

<?xml version="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:gravity="center"

>

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/imageView"

/>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:textSize="16sp"

android:textColor="#000099"

android:id="@+id/textView"

/>

</LinearLayout>

4. 使用的图像

/PopupWindow/res/drawable/i1.png

/PopupWindow/res/drawable/i2.png

/PopupWindow/res/drawable/i3.png

/PopupWindow/res/drawable/i4.png

/PopupWindow/res/drawable/i5.png

/PopupWindow/res/drawable/i6.png

/PopupWindow/res/drawable/i7.png

/PopupWindow/res/drawable/i8.png

5. 显示/隐藏的动画

/PopupWindow/res/values/styles.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

<style name="animation">

<itemname="android:windowEnterAnimation">@anim/enter</item>

<itemname="android:windowExitAnimation">@anim/out</item>

</style>

</resources>

/PopupWindow/res/anim/enter.xml

<?xml version="1.0"encoding="utf-8"?>

<setxmlns:android="http://schemas.android.com/apk/res/android"

android:shareInterpolator="false">

<translate

android:fromYDelta="100%p"

android:toYDelta="0"

android:duration="500"

/>

<alpha

android:fromAlpha="0.7"

android:toAlpha="1.0"

android:duration="300"

/>

</set>

/PopupWindow/res/anim/out.xml

<?xml version="1.0"encoding="utf-8"?>

<setxmlns:android="http://schemas.android.com/apk/res/android"

android:shareInterpolator="false">

<translate

android:fromYDelta="0"

android:toYDelta="100%p"

android:duration="3000"

/>

<alpha

android:fromAlpha="1.0"

android:toAlpha="0.5"

android:duration="2000"

/>

</set>

位置图如下:

显示效果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 11:16:37

android学习笔记---63-PopupWindow,泡泡窗口的实现的相关文章

Android学习笔记(七)——显示对话框窗口

显示对话框窗口 1.创建Dialog1项目,在activity_main.xml文件中添加一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:l

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

udacity android学习笔记: lesson 3

udacity android学习笔记: lesson 3 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Markdown/an

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

Pro Android学习笔记(十二):了解Intent(下)

解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键就是component 名字,在<intent-fliter>中声明的其他属性被忽略.对于implicit intent,则根据action,category和data来进行匹配.然而一个intent fliter中可以声明多个actions,多个categories,多个data属性,因此可以满

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记之mainfest文件中android属性

Android学习笔记之mainfest文件中android属性 - Impossible is nothing - 博客频道 - CSDN.NET 以前的零散笔记, 共享一下, 有错误的地方还请指正. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务.---------------------------------------------------------------------------------

Android学习笔记-----------内容提供者

Android学习笔记-----------内容提供者 简介 内容提供者主要用于在不同的程序之间实现数据共享的功能;一个程序想要访问其他程序种由内容提供者提供的数据,必须依赖于contentresolver这个类的实例,可以通过getContentResolver()这个方法来获取这个类的实例;这个类提供有query(),insert(),update(),delete()等方法来操作数据这些方法都需要提供个Uri类型的参数,这个Uri对应的就是你需要操作的数据引用.一个uri主要由以以下几个部

Android学习笔记&#183;从零开始【一】

开始着手Android.和大多数初用Eclipse的人一样,有些手忙脚乱. 之前看Cocos2d时零星的看过:Cocos2d后来也被耽搁下来了:关于Cocos2d点此穿越,日后更新笔记. 现做下Android学习笔记,记录点滴. -->点击进入Android学习笔记导图.         -->19本Android经典教程+104个Github上火爆项目开源源码 加油! ●1 绑定的SDK工具包http://developer.android.com/sdk ●2 Application Na

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan