Android:实现一种浮动选择菜单的效果

前几天更新了一下我手机上的百阅软件,上面的浮动对话框选择很好看,就模仿了一下。先看一下运行效果。

  主要原理是在dialog里扔进一个GridView,可以作为一个组件使用。源码如下

主要原理是在dialog里扔进一个GridView,可以作为一个组件使用。源码如下

对话框使用的layout:grid_dialog.xml

[xhtml] view plaincopyprint?

  1. <?xml
    version="1.0"
    encoding="utf-8"?>
  2. <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/layout_root"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. >
  7. <GridView
    android:id="@+id/mygridview"
  8. android:numColumns="3"
  9. android:gravity="center"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:padding="10dp"
  13. android:verticalSpacing="20dp"
  14. android:horizontalSpacing="10dp"
  15. android:stretchMode="columnWidth"
  16. >
  17. </GridView>
  18. </RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<GridView android:id="@+id/mygridview"
android:numColumns="3"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:verticalSpacing="20dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
>
</GridView>
</RelativeLayout>

对话框列表中的项目layout:grid_item.xml

[xhtml] view plaincopyprint?

  1. <?xml
    version="1.0"
    encoding="utf-8"?>
  2. <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/RelativeLayout01"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:gravity="center"
  7. >
  8. <ImageView
    android:id="@+id/item_image"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_centerHorizontal="true"
  12. />
  13. <TextView
    android:id="@+id/item_text"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_below="@id/item_image"
  17. android:layout_centerHorizontal="true"
  18. android:text="@+id/item_text"/>
  19. </RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>

<ImageView android:id="@+id/item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
/>

<TextView android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/item_image"
android:layout_centerHorizontal="true"
android:text="@+id/item_text"/>

</RelativeLayout>

自定义的对话框类:GridDialog.java

[java] view plaincopyprint?

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import android.app.Activity;
  6. import android.app.Dialog;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.view.Gravity;
  10. import android.view.View;
  11. import android.view.Window;
  12. import android.view.WindowManager.LayoutParams;
  13. import android.widget.AdapterView;
  14. import android.widget.AdapterView.OnItemClickListener;
  15. import android.widget.GridView;
  16. import android.widget.SimpleAdapter;
  17. import android.widget.Toast;
  18. public class GridDialog
    extends Dialog {
  19. private List<int[]> griditem =
    new ArrayList<int[]>();
  20. {
  21. griditem.add(new
    int[] { R.drawable.edit, R.string.edit });//图片资源,标题,可自己设定
  22. griditem.add(new int[] { R.drawable.delete, R.string.delete });
  23. griditem.add(new
    int[] { R.drawable.favsaddto, R.string.favsaddto });
  24. griditem.add(new int[] { R.drawable.favs, R.string.favs });
  25. griditem.add(new
    int[] { R.drawable.settings, R.string.settings });
  26. griditem.add(new int[] { R.drawable.sync, R.string.sync });
  27. griditem.add(new
    int[] { R.drawable.save, R.string.save });
  28. griditem.add(new int[] { R.drawable.search, R.string.search });
  29. griditem.add(new
    int[] { R.drawable.camera, R.string.camera });
  30. };
  31. private GridView gridview;
  32. public GridDialog(Context context,
    boolean cancelable,
  33. OnCancelListener cancelListener) {
  34. super(context, cancelable, cancelListener);
  35. }
  36. public GridDialog(Context context,
    int theme) {
  37. super(context, theme);
  38. }
  39. private void initGrid() {
  40. List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
  41. for (int[] item : griditem) {
  42. Map<String, Object> map = new HashMap<String, Object>();
  43. map.put("image", item[0]);
  44. map.put("title", getContext().getString(item[1]));
  45. items.add(map);
  46. }
  47. SimpleAdapter adapter = new SimpleAdapter(getContext(),
  48. items, // 列表内容
  49. R.layout.grid_item, new String[] {
    "title", "image" },
  50. new int[] { R.id.item_text, R.id.item_image });
  51. gridview = (GridView) findViewById(R.id.mygridview);
  52. // 为GridView设置数据
  53. gridview.setAdapter(adapter);
  54. }
  55. public GridDialog(Context context) {
  56. super(context);
  57. requestWindowFeature(Window.FEATURE_NO_TITLE);
    // 灭掉对话框标题,要放在setContentView前面否则会报错
  58. setContentView(R.layout.grid_dialog);
  59. setCanceledOnTouchOutside(true);// 点击对话框外部取消对话框显示
  60. LayoutParams lp = getWindow().getAttributes();
  61. getWindow().setAttributes(lp);
  62. getWindow().addFlags(LayoutParams.FLAG_BLUR_BEHIND);// 添加模糊效果
  63. // 设置透明度,对话框透明(包括对话框中的内容)alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明
  64. // lp.alpha = 0.5f;
  65. lp.dimAmount = 0.1f;// 设置对话框显示时的黑暗度,0.0f和1.0f之间,在我这里设置成0.0f会出现黑屏状态,求解。
  66. initGrid();// 添加表格按钮内容
  67. }
  68. /**
  69. * 绑定事件到指定的Activity上
  70. *
  71. * @param activity
  72. */
  73. public void bindEvent(Activity activity) {
  74. setOwnerActivity(activity);// )把对话框附着到一个Activity上
  75. gridview.setOnItemClickListener(new OnItemClickListener() {
  76. public void onItemClick(AdapterView<?> parent, View v,
  77. int position,
    long id) {
  78. switch (position) {// position从0开始,GridView中按钮的位置
  79. case 0:
  80. Toast.makeText(getContext(), "测试", Toast.LENGTH_SHORT)
  81. .show();
  82. break;
  83. }
  84. }
  85. });
  86. }
  87. }

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class GridDialog extends Dialog {

private List<int[]> griditem = new ArrayList<int[]>();
{
griditem.add(new int[] { R.drawable.edit, R.string.edit });//图片资源,标题,可自己设定
griditem.add(new int[] { R.drawable.delete, R.string.delete });
griditem.add(new int[] { R.drawable.favsaddto, R.string.favsaddto });
griditem.add(new int[] { R.drawable.favs, R.string.favs });
griditem.add(new int[] { R.drawable.settings, R.string.settings });
griditem.add(new int[] { R.drawable.sync, R.string.sync });
griditem.add(new int[] { R.drawable.save, R.string.save });
griditem.add(new int[] { R.drawable.search, R.string.search });
griditem.add(new int[] { R.drawable.camera, R.string.camera });
};

private GridView gridview;

public GridDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}

public GridDialog(Context context, int theme) {
super(context, theme);
}

private void initGrid() {
List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();

for (int[] item : griditem) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", item[0]);
map.put("title", getContext().getString(item[1]));
items.add(map);
}

SimpleAdapter adapter = new SimpleAdapter(getContext(),
items, // 列表内容
R.layout.grid_item, new String[] { "title", "image" },
new int[] { R.id.item_text, R.id.item_image });

gridview = (GridView) findViewById(R.id.mygridview);
// 为GridView设置数据
gridview.setAdapter(adapter);

}

public GridDialog(Context context) {

super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 灭掉对话框标题,要放在setContentView前面否则会报错

setContentView(R.layout.grid_dialog);

setCanceledOnTouchOutside(true);// 点击对话框外部取消对话框显示
LayoutParams lp = getWindow().getAttributes();
getWindow().setAttributes(lp);

getWindow().addFlags(LayoutParams.FLAG_BLUR_BEHIND);// 添加模糊效果

// 设置透明度,对话框透明(包括对话框中的内容)alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明
// lp.alpha = 0.5f;

lp.dimAmount = 0.1f;// 设置对话框显示时的黑暗度,0.0f和1.0f之间,在我这里设置成0.0f会出现黑屏状态,求解。

initGrid();// 添加表格按钮内容
}

/**
* 绑定事件到指定的Activity上
*
* @param activity
*/
public void bindEvent(Activity activity) {

setOwnerActivity(activity);// )把对话框附着到一个Activity上

gridview.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {

switch (position) {// position从0开始,GridView中按钮的位置
case 0:
Toast.makeText(getContext(), "测试", Toast.LENGTH_SHORT)
.show();
break;
}
}
});
}
}

上面的代码没有实现active的跳转。如果想实现跳转采用下面方法:

[java] view plaincopyprint?

  1. private void redirect(Class<?> cls) {
  2. if (getOwnerActivity().getClass() != cls) {//如果不是对话框绑定的active则跳转
  3. dismiss();//关闭对话框
  4. Intent intent = new Intent();
  5. intent.setClass(getContext(), cls);
  6. getContext().startActivity(intent);//跳转
  7. }
  8. }

private void redirect(Class<?> cls) {
if (getOwnerActivity().getClass() != cls) {//如果不是对话框绑定的active则跳转
dismiss();//关闭对话框
Intent intent = new Intent();
intent.setClass(getContext(), cls);
getContext().startActivity(intent);//跳转
}
}

对话框调用方法:

[java] view plaincopyprint?

  1. public class MainActivity
    extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. Button button=(Button) findViewById(R.id.Button01);
  8. button.setOnClickListener(new Button.OnClickListener(){
  9. @Override
  10. public void onClick(View arg0) {
  11. GridDialog dialog=new GridDialog(MainActivity.this);
  12. dialog.bindEvent(MainActivity.this);
  13. dialog.show();
  14. }
  15. });
  16. }
  17. }

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button=(Button) findViewById(R.id.Button01);
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
GridDialog dialog=new GridDialog(MainActivity.this);
dialog.bindEvent(MainActivity.this);

dialog.show();
}

});
}
}


这个功能还是比较弱,比如无法动态增加按钮。这里为了简洁将一些style效果写到代码里了,还是写入xml里容易控制。

时间: 2024-09-09 09:16:47

Android:实现一种浮动选择菜单的效果的相关文章

Android实现下拉导航选择菜单效果

本文介绍在Android中如何实现下拉导航选择菜单效果.   关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单.我们可以让我们的应用顶部有左右滑动或进行切换的导航菜单,也可以为了增强用户体验在应用中添加这样的下拉导航选择菜单效果. 关于它的实现原理,其实也是挺简单的,就是使用PopupWindow来进行展现,在显示时控制其高度并配置以相应的动画效果.在PopupWindow中我使用GridView来控制里面的菜单项,每个菜单项对应相应的

Android仿今日头条APP实现下拉导航选择菜单效果_Android

本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下 关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单.我们可以让我们的应用顶部有左右滑动或进行切换的导航菜单,也可以为了增强用户体验在应用中添加这样的下拉导航选择菜单效果. 关于它的实现原理,其实也是挺简单的,就是使用PopupWindow来进行展现,在显示时控制其高度并配置以相应的动画效果.在PopupWindow中我使用GridView

Android系列之UI组件----Menu菜单

[正文] 从官方文档了解到,从Android3.0(API level 11)开始,Android设备不再要求提供一个专门的菜单按钮,转而推荐使用ActionBar.所以现在市面上很多新设备使用三个虚拟按键,并不再额外提供菜单按钮. 因为Android版本的发展,对于菜单的支持各个版本有很大的区别,而Android3.0是个分水岭,大概可以分为下面三类: OptionMenu和ActionBar:一些操作的集合,如果开发的平台在Android3.0之上,推荐使用ActionBar,如果开发的平台

Android自定义控件案例汇总1(菜单、popupwindow、viewpager)_Android

自定义控件是根据自己的需要自己来编写控件.安卓自带的控件有时候无法满足你的需求,这种时候,我们只能去自己去实现适合项目的控件.同时,安卓也允许你去继承已经存在的控件或者实现你自己的控件以便优化界面和创造更加丰富的用户体验.在平常的项目中,我们 人为的把自定义控件分为两种:一种是组合方式实现.一种是通过继承view或viewgroup及其子类实现.两者都可以实现我们想要的效果,因此,我们可以根据自己的需求,选择合适的方案.本文以案例的形式来显示几种较为常见的自定义控件. 案例一 优酷菜单: 功能介

Android基于TranslateAnimation的动画动态菜单

先请注意,这里的菜单并不是按机器上的MENU出现在那种菜单,而是基于Android SDK提供的android.view.animation.TranslateAnimation(extends android.view.animation.Animation)类实例后附加到一个Layout上使之产生的有动画出现和隐藏效果的菜单. 原理:Layout(菜单)从屏幕内(挨着屏幕边沿,其实并非一定,视需要的初态和末态而定)动态的移动到屏幕外(在外面可以挨着边沿,也可以离远点,这个无所谓了),这样就可

【转】解决win7下重装winXP 系统启动选择菜单消失 问题

解决win7下重装winXP 系统启动选择菜单消失 问题 帮了一个哥们重装了winXP 发现居然他的双系统选择菜单不见了 呵呵 发现从来没有遇到过这种情况 就上网找了一下 大多数都说改系统盘里面的boot.ini的配置信息就好 可是本着大多数不一定是正确的观念 又去Google了一下 才得知真相 从Vista以上的操作系统开始 系统的启动不再依靠boot.ini来运行 这里先普及一下这个系统文件的知识 Boot.ini 是什么 ==================================

Android开发之各种双向侧滑菜单的实现

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39670935,本文出自:[张鸿洋的博客] 1.概述 关于自定义控件侧滑已经写了两篇了~~今天决定把之前的单向改成双向,当然了,单纯的改动之前的代码也没意思,今天不仅会把之前的单向改为双向,还会多添加一种侧滑效果,给大家带来若干种形态各异的双向侧滑菜单,不过请放心,代码会很简单~~然后根据这若干种,只要你喜欢,相信你可以打造任何绚(bian)丽(tai)效果的双向侧滑菜单~~ 首

android视频解码-android视频加速播放可选择多少倍速播放

问题描述 android视频加速播放可选择多少倍速播放 请问android视频加速播放是如何实现的!例如以1.5倍速播放视频.求教原理 解决方案 视频是由连续的帧形成的,一个帧对应一个画面,就像胶片电影.通过每秒切换多少帧形成连续的画面,当切换速度大于眼睛所能接受的速度时(貌似人眼每秒能接受24帧),那么我们就无法察觉这些变化了,我们大脑所接受的图像便是一段视频图像.这便是帧率.假如一个视频的默认帧率为60帧每秒,当我们在播放时采用120帧每秒的帧速率.那么我们看到的视频就以原来的2倍速度播放.

Android开发技巧之我的菜单我做主(自定义菜单)_Android

     Android SDK本身提供了一种默认创建菜单的机制.但通过这种机制创建的菜单虽然从功能上很完备,但在界面效果上实在是有点"土".对于一个拥有绚丽界面的程序配上一个有点"土"的菜单,会使用户感觉很怪,甚至会使绚丽的界面大打折扣.实际上,对于如此灵活和强大的Android系统,修改菜单的样式只是小菜一碟.为程序加入漂亮菜单的方法很多.在本节先介绍一种比较常用的方法,就是通过onKeyDown事件方法和PopupWindow实现自定义的菜单.至于通过这种技术