在Android中有很多级别的Window,不同级别的Window按照z-index方向分布。下面看看Android控件(view)PopupWindow的用法(位置、动画、焦点)。
1、创建PopouWindow及相关参数设置
//创建一个包含自定义view的PopupWindow
private PopupWindow makePopupWindow(Context cx) {
PopupWindow window;
window = new PopupWindow(cx);
TextView contentView = new TextView(cx);
contentView.setGravity(Gravity.CENTER);
final Resources res = cx.getResources();
// contentView.setBackgroundColor(R.color.page_window_bgcolor);
// window.setBackgroundDrawable(new
// ColorDrawable(res.getColor(R.color.page_window_bgcolor)));
contentView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
//设置PopupWindow显示和隐藏时的动画
window.setAnimationStyle(R.style.AnimationFade);
//设置PopupWindow的大小(宽度和高度)
window.setWidth(res.getDimensionPixelSize(R.dimen.page_window_width));
window.setHeight(res.getDimensionPixelSize(R.dimen.page_window_height));
//设置PopupWindow的内容view
window.setContentView(contentView);
//设置PopupWindow外部区域是否可触摸
window.setOutsideTouchable(true);
return window;
}
|
2、PopupWindow显示和隐藏的动画设置
XML配置代码:
<!-- PopupWindow窗口淡入淡出动画 -->
<style name="AnimationFade">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
<item name="android:windowExitAnimation">@anim/fade_out</item>
</style>
JAVA代码:
window.setAnimationStyle(R.style.AnimationFade);
3、PopupWindow的焦点设置
window.setFocusable(true); //设置PopupWindow可获得焦点
window.setTouchable(true); //设置PopupWindow可触摸
window.setOutsideTouchable(true); //设置非PopupWindow区域可触摸
4、PopupWindow的显示及显示位置设置
window.showAtLocation();
window.showAsDropDown();
这些方法及相关参数使用将在后面详细介绍,具体查看文章 Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
UCWeb的菜单看起来不错,自己想模仿做一个,苦恼一直没有思路
google了几天,终于找到一个帖子 http://www.eoeandroid.com/viewthread.php?tid=28824
按照上面提供的思路实现了
1、保留menu按键作用
2、用popupwindow作为菜单显示容器
3、用GridView显示所有子菜单
代码
1、布局文件
popupwindow.xml
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
LinearLayout xmlns:android
=
"
http://schemas.android.com/apk/res/android
"
android:layout_width
=
"
fill_parent
"
android:background
=
"
#50000000
"
android:layout_height
=
"
fill_parent
"
android:gravity
=
"
bottom|center_horizontal
"
>
<
LinearLayout xmlns:android
=
"
http://schemas.android.com/apk/res/android
"
android:layout_width
=
"
320dip
"
android:background
=
"
@drawable/bkg2
"
android:id
=
"
@+id/popdialog
"
android:layout_height
=
"
250dip
"
android:gravity
=
"
center_vertical|center_horizontal
"
>
<
GridView android:id
=
"
@+id/gridview
"
android:layout_width
=
"
fill_parent
"
android:layout_height
=
"
fill_parent
"
android:numColumns
=
"
4
"
android:verticalSpacing
=
"
10dip
"
android:horizontalSpacing
=
"
10dip
"
android:stretchMode
=
"
columnWidth
"
android:gravity
=
"
center
"
/>
</
LinearLayout
>
</
LinearLayout
>
item_menu.xml
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
RelativeLayout xmlns:android
=
"
http://schemas.android.com/apk/res/android
"
android:id
=
"
@+id/RelativeLayout_Item
"
android:layout_width
=
"
fill_parent
"
android:layout_height
=
"
wrap_content
"
android:paddingBottom
=
"
5dip
"
>
<
ImageView android:id
=
"
@+id/item_image
"
android:layout_centerHorizontal
=
"
true
"
android:layout_width
=
"
40dip
"
android:layout_height
=
"
40dip
"
>
</
ImageView
>
<
TextView android:layout_below
=
"
@id/item_image
"
android:id
=
"
@+id/item_text
"
android:layout_centerHorizontal
=
"
true
"
android:layout_width
=
"
wrap_content
"
android:layout_height
=
"
wrap_content
"
style
=
"
@style/Text.Location
"
android:text
=
"
选项
"
></
TextView
>
</
RelativeLayout
>
2、用popupwindow作为菜单显示容器
View view
=
this
.getLayoutInflater().inflate(R.layout.popwindowdemo,
null
); pop
=
new
PopupWindow(view,
320
,
450
);
//
大小设置为全屏幕,这里硬编码的,可修改
pop.setOutsideTouchable(
false
); pop.setBackgroundDrawable(
new
BitmapDrawable()); pop.setFocusable(
true
);
//
如果不加这个,Grid不会响应ItemClick
pop.setTouchInterceptor(
new
OnTouchListener() {
public
boolean
onTouch(View v, MotionEvent event) {
//
TODO Auto-generated method stub
if
(event.getY()
<
240
){
//
这里处理,当点击gridview以外区域的时候,菜单关闭
if
(pop.isShowing()) pop.dismiss(); } Log.d(
"
Demo
"
,
"
popupWindow::onTouch >>> view:
"
+
v
+
"
, event:
"
+
event);
return
false
; } });
3、初始化gridview
/**
菜单图片 *
*/
int
[] menu_image_array
=
{ R.drawable.menu_search, R.drawable.menu_filemanager, R.drawable.menu_downmanager, R.drawable.menu_fullscreen, R.drawable.menu_inputurl, R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import, R.drawable.menu_sharepage, R.drawable.menu_quit, R.drawable.menu_nightmode, R.drawable.menu_refresh, R.drawable.menu_more };
/**
菜单文字 *
*/
String[] menu_name_array
=
{
"
搜索
"
,
"
文件管理
"
,
"
下载管理
"
,
"
全屏
"
,
"
网址
"
,
"
书签
"
,
"
加入书签
"
,
"
分享页面
"
,
"
退出
"
,
"
夜间模式
"
,
"
刷新
"
,
"
更多
"
};
/**
* 构造菜单Adapter * *
@param
menuNameArray * 名称 *
@param
imageResourceArray * 图片 *
@return
SimpleAdapter
*/
private
SimpleAdapter getMenuAdapter(String[] menuNameArray,
int
[] imageResourceArray) { ArrayList
<
HashMap
<
String, Object
>>
data
=
new
ArrayList
<
HashMap
<
String, Object
>>
();
for
(
int
i
=
0
; i
<
menuNameArray.length; i
++
) { HashMap
<
String, Object
>
map
=
new
HashMap
<
String, Object
>
(); map.put(
"
itemImage
"
, imageResourceArray[i]); map.put(
"
itemText
"
, menuNameArray[i]); data.add(map); } SimpleAdapter simperAdapter
=
new
SimpleAdapter(
this
, data, R.layout.item_menu,
new
String[] {
"
itemImage
"
,
"
itemText
"
},
new
int
[] { R.id.item_image, R.id.item_text });
return
simperAdapter; }
menuGrid
=
(GridView) view.findViewById(R.id.gridview); menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array));
4、注册Menu弹起事件
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
//
TODO Auto-generated method stub
pop.showAtLocation(findViewById(R.id.mainfrm), Gravity.CENTER
|
Gravity.BOTTOM,
0
,
0
);
return
false
;
//
super.onCreateOptionsMenu(menu);
}
5、注册menu子菜单单击事件
menuGrid.setOnItemClickListener(
new
OnItemClickListener() {
public
void
onItemClick(AdapterView
<?>
arg0, View arg1,
int
arg2,
long
arg3) { Log.v(
"
Demo
"
,
"
menuGrid.setOnItemClickListener:
"
+
arg2
+
"
"
+
arg3); Toast.makeText(UIMenu.
this
,
"
Click
"
+
arg2, Toast.LENGTH_SHORT).show();
if
(pop.isShowing())
//
关闭菜单
pop.dismiss(); } });