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

来源:互联网 发布:数据分析ui设计界面 编辑:程序博客网 时间:2024/04/30 23:46

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

  主要原理是在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>

对话框列表中的项目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. <ImageViewandroid: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>

自定义的对话框类: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 GridDialogextends 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. }

上面的代码没有实现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. }

对话框调用方法:

[java] view plaincopyprint?
  1. public class MainActivityextends 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. }


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


原创粉丝点击