弹窗,可以使用PopupWindow方式,也可以自己制作一个PopupWindow,下面分说两种方式:
(一)自己制作一个PopupWindow,实际是一个activity,关键是加入自定义的theme
效果图如下:
(1)自定义弹窗activity类SelectPicPopupWindow.java
package com.example.picpopupwindow; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class SelectPicPopupWindow extends Activity { private Button btn_cancel; private LinearLayout layout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alert_dialog); btn_cancel = (Button) this.findViewById(R.id.btn_cancel); layout = (LinearLayout) findViewById(R.id.pop_layout); // 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity layout.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!", Toast.LENGTH_SHORT).show(); } }); // 添加按钮监听 btn_cancel.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { finish(); } }); } // 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity @Override public boolean onTouchEvent(MotionEvent event) { finish(); return true; } }
(2) 布局文件alert_dialog.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" > <LinearLayout android:id="@+id/pop_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/shape_half_rounded" android:gravity="center_horizontal" android:orientation="vertical" > <Button android:id="@+id/btn_take_photo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:layout_marginTop="20dip" android:background="@drawable/btn_style_alert_dialog_button" android:text="拍照" android:textStyle="bold" /> <Button android:id="@+id/btn_pick_photo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:layout_marginTop="5dip" android:background="@drawable/btn_style_alert_dialog_button" android:text="从相册选择" android:textStyle="bold" /> <Button android:id="@+id/btn_cancel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="15dip" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:layout_marginTop="15dip" android:background="@drawable/btn_style_alert_dialog_cancel" android:text="取消" android:textColor="#ffffff" android:textStyle="bold" /> </LinearLayout> </RelativeLayout>
(3)弹出层的半圆角背景,可以使用.9文件,也可以使用shape制作的半圆角背景shape_half_rounded.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#CCCCCC" /> <corners android:bottomLeftRadius="0px" android:bottomRightRadius="0px" android:topLeftRadius="10px" android:topRightRadius="10px" /> <padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp" /> </shape>
(4)按钮点击效果(图片附件有)
btn_style_alert_dialog_button.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_style_alert_dialog_button_pressed" android:state_pressed="true"/> <item android:drawable="@drawable/btn_style_alert_dialog_button_normal"/> </selector>
btn_style_alert_dialog_cancel.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_style_alert_dialog_button_pressed" android:state_pressed="true"/> <item android:drawable="@drawable/btn_style_alert_dialog_cancel_normal"/> </selector>
使用很简单:
(1)MainActivity.java
package com.example.picpopupwindow; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView photo; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); photo = (ImageView) this.findViewById(R.id.text); // 把文字控件添加监听,点击弹出自定义窗口 photo.setOnClickListener(new OnClickListener() { public void onClick(View v) { //使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数 startActivity(new Intent(MainActivity.this,SelectPicPopupWindow.class)); } }); } }
(2)简单的布局文件(就一张图,一点击就弹出选择菜单)activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:background="@drawable/app_panel_friendcard_icon" /> </RelativeLayout>
(3)AndroidManifest.xml(关键是使用了自定义的theme)
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.picpopupwindow" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SelectPicPopupWindow" android:theme="@style/MyDialogStyleBottom" /> </application> </manifest>
(4)关键的主题styles.xml:
<resources> <style name="AppTheme" parent="android:Theme.Light" /> <style name="AnimBottom" parent="@android:style/Animation"> <item name="android:windowEnterAnimation">@anim/push_bottom_in</item> <item name="android:windowExitAnimation">@anim/push_bottom_out</item> </style> <!-- 想实现Dialog方式可以继承 parent="android:Theme.Dialog" ,想当成普通的activity可以继承 parent="android:Theme.Light"--> <style name="MyDialogStyleBottom" parent="android:Theme.Light"> <item name="android:windowAnimationStyle">@style/AnimBottom</item> <!-- 边框 --> <item name="android:windowFrame">@null</item> <!-- 是否浮现在activity之上,Dialog才会将它设置为true,默认是false的,所以不是想实现Dialog浮现方式,可以不用写这个item --> <!-- <item name="android:windowIsFloating">false</item> --> <!-- 半透明 --> <item name="android:windowIsTranslucent">true</item> <!-- 无标题 --> <item name="android:windowNoTitle">true</item> <!-- 背景透明 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 模糊 --> <item name="android:backgroundDimEnabled">true</item> <!-- 全屏,如果设置为true,并且android:windowIsFloating也设置为false之后,才会看到全屏效果, 即手机本身的小通知图标栏都消息掉。 我测试过,将android:windowIsFloating设置为true,和将style的继承parent设置为android:Theme.Dialog效果是一样的,都不会全屏,且左右两边有空间 默认是false,所以不想全屏,可以不写这个item --> <item name="android:windowFullscreen">false</item> </style> </resources>
这里特别要注意的是android:windowIsFloating设置,如果设置为true,那么左右两边怎么都会有较大的空隙,死也不会全屏。
(5) 进入退出动画:
push_bottom_in.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 上下滑入式 --> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromYDelta="100%p" android:toYDelta="0" /> </set>
push_bottom_out.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 上下滑出式 --> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromYDelta="0" android:toYDelta="50%p" /> </set>
就这样简单实现了弹出层,源代码见PicPopupWindow.zip。
(二)继承PopupWindow的方式来实现一个想要的弹出窗口:
(1)SelectPicPopupWindow.java(布局alert_dialog跟上面一样的)
package com.example.picpopupwindow; import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; 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; public class SelectPicPopupWindow extends PopupWindow { private Button btn_take_photo, btn_pick_photo, btn_cancel; private View mMenuView; public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) { super(context); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMenuView = inflater.inflate(R.layout.alert_dialog, null); btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo); btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo); btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel); //取消按钮 btn_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { //销毁弹出框 dismiss(); } }); //设置按钮监听 btn_pick_photo.setOnClickListener(itemsOnClick); btn_take_photo.setOnClickListener(itemsOnClick); //设置SelectPicPopupWindow的View this.setContentView(mMenuView); //设置SelectPicPopupWindow弹出窗体的宽 this.setWidth(LayoutParams.FILL_PARENT); //设置SelectPicPopupWindow弹出窗体的高 this.setHeight(LayoutParams.WRAP_CONTENT); //设置SelectPicPopupWindow弹出窗体可点击,点击就消失的功能,也是这里设置的 this.setFocusable(true); //设置SelectPicPopupWindow弹出窗体动画效果 this.setAnimationStyle(R.style.AnimBottom); //实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0x00000000); //设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw); /** * mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框 */ mMenuView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = mMenuView.findViewById(R.id.pop_layout).getTop(); int y=(int) event.getY(); if(event.getAction()==MotionEvent.ACTION_UP){ if(y<height){ dismiss(); } } return true; } }); } }
(2) 使用时,这里要指定在哪个控件的哪个方向上显示自定义的popupWindow:
package com.example.picpopupwindow; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class MainActivity extends Activity { //自定义的弹出框类 SelectPicPopupWindow menuWindow; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) this.findViewById(R.id.text); //把文字控件添加监听,点击弹出自定义窗口 tv.setOnClickListener(new OnClickListener() { public void onClick(View v) { //实例化SelectPicPopupWindow menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick); //显示窗口 menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置 menuWindow.setBackgroundDrawable(getResources().getDrawable(R.color.half_transparent)); } }); } //为弹出窗口实现监听类 private OnClickListener itemsOnClick = new OnClickListener(){ public void onClick(View v) { menuWindow.dismiss(); switch (v.getId()) { case R.id.btn_take_photo: break; case R.id.btn_pick_photo: break; default: break; } } }; }
自定义的PopupWindow这里不用在AndroidManifest.xml里进行配置,直接使用,所以不用定主题,效果跟第一种自已使用activity制作的一样,代码见PicPopupWindow2.zip
相关推荐
本资料包"Android源码——PopupWindow实现弹出菜单.zip"主要聚焦于如何利用`PopupWindow`来创建自定义的弹出菜单。下面将详细介绍`PopupWindow`的基本概念、工作原理以及实现弹出菜单的关键步骤。 `PopupWindow` 是...
这个压缩包“安卓Android源码——Android之用PopupWindow实现弹出菜单.zip”显然是为了演示如何使用`PopupWindow`来构建弹出菜单。现在,我们将深入探讨`PopupWindow`的使用及其背后的原理。 `PopupWindow` 是 ...
本资料"Android PopupWindow实现弹出菜单.zip"应该包含了如何利用PopupWindow在Android应用中构建弹出菜单的详细教程。 PopupWindow的核心特性在于它的灵活性和非侵入性,它不是一个独立的Activity,而是依附于某个...
本文将详细介绍如何使用`PopupWindow`在Android应用中模仿微信右上角的弹出菜单效果。 首先,我们需要理解`PopupWindow`的基本用法。`PopupWindow` 是一个可以在屏幕任意位置显示的窗口,它不依附于任何Activity,...
通过学习和实践这份"Android之用PopupWindow实现弹出菜单"的资料,开发者能够掌握使用PopupWindow创建动态、交互丰富的弹出菜单,进一步提升Android应用的用户体验。在实际开发中,PopupWindow的应用场景广泛,熟练...
本资料包"Android代码-之用PopupWindow实现弹出菜单.zip"显然是为了演示如何在Android应用中使用PopupWindow来构建一个弹出菜单。 首先,我们来理解PopupWindow的基本概念。PopupWindow是Android SDK提供的一种轻量...
1. 键盘遮挡:当PopupWindow弹出时,如果底部有输入框导致软键盘弹出,可能会遮挡菜单。可以监听`onGlobalLayout`事件,根据屏幕高度变化动态调整PopupWindow的位置。 2. 销毁处理:确保在不再需要PopupWindow时...
在Android开发中,有时我们需要创建一个可自定义的弹出菜单,这通常通过使用`PopupWindow`类来实现。`PopupWindow`是Android系统提供的一个轻量级窗口,它可以显示在屏幕上的任意位置,用于创建浮动、弹出式的UI组件...
通过学习和实践这个`PopupWindow`与`ListView`结合的示例,开发者能够掌握创建自定义弹出菜单的技巧,进一步提升Android应用的用户体验。记得在实际项目中,根据具体场景调整`PopupWindow`的大小、位置以及显示和...
本项目"安卓Android源码——用PopupWindow实现弹出菜单.zip"显然是一个演示如何使用`PopupWindow`来构建弹出菜单的实例。下面我们将深入探讨`PopupWindow`的关键知识点。 首先,`PopupWindow` 是 Android SDK 提供...
以上就是使用PopupWindow在Android中实现右侧、左侧和底部弹出菜单的基本流程。通过自定义布局、动画和交互,你可以创建出符合应用风格的个性化菜单。记得在实际开发中根据具体需求进行调整,确保弹出菜单的易用性和...
本项目源码着重展示了如何利用PopupWindow来创建一个可自定义的弹出菜单。下面我们将深入探讨PopupWindow的工作原理、使用方法以及在源码中的实现细节。 一、PopupWindow基本概念 PopupWindow是Android提供的一个...
本资源"Android安卓源码_PopupWindow弹出菜单.zip"提供了一个具体的示例,帮助开发者深入理解如何在实际应用中使用`PopupWindow`。 `PopupWindow`的基本概念: 1. `PopupWindow`类是Android SDK中的一个类,它可以...
这个压缩包"安卓开发-Android之用PopupWindow实现弹出菜单.zip"显然是为了帮助开发者理解如何在Android应用中使用PopupWindow来创建弹出菜单。以下将详细介绍PopupWindow及其在实现弹出菜单中的应用。 首先,...
这个“Android应用源码之之用PopupWindow实现弹出菜单”的项目,显然是为了教授如何在毕业设计中运用PopupWindow来创建动态的用户交互界面。 首先,PopupWindow是Android SDK提供的一种轻量级窗口,它可以浮现在...
这个压缩包“安卓Android源码——精典源码之之用PopupWindow实现弹出菜单.zip”显然是提供了一个使用`PopupWindow`创建弹出菜单的实例代码。下面我们将深入探讨`PopupWindow`的工作原理及其在实际应用中的使用方法。...