• 实现Android半透明Menu效果的开发实例


    不知道大家是否用过天天动听,对于它界面上的半透明Menu效果,笔者感觉非常漂亮。下面是天天动听半透明Menu的截图,欣赏下吧:

    Android半透明Menu效果

           感觉还不错吧?那么如何实现这种半透明Menu效果呢?本文就重点讨论并给出这种Menu的具体代码实现过程。

           首先分析下实现这种半透明Menu所需做的工作,并进行合理分解:

           1.  利用Shaper设置一个半透明圆角背景。

           2.  定义Menu布局,主要就GridView,把图标都放在这个GridView。

           3.  Menu事件, 通过PopupWindow或者AlertDialog或者透明Activity显示到页面即可。

           4.  按钮的监听事件,实例中没加。需要的话自己在Adapter里加。

           比较简单,不多说了。

           半透明圆角背景xml:

    XML/HTML代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2.   
    3. <shape android:shape="rectangle">     
    4.   
    5.     <solid android:color="#b4000000" />  
    6.   
    7.     <stroke android:width="2.0dip" android:color="#b4ffffff" android:dashWidth="3.0dip" android:dashGap="0.0dip" />  
    8.   
    9.     <padding android:left="7.0dip" android:top="7.0dip" android:right="7.0dip" android:bottom="7.0dip" />  
    10.   
    11.     <corners android:radius="8.0dip" />  
    12.   
    13. </shape>  

            Menu布局:

    XML/HTML代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2.   
    3. <LinearLayout  
    4.   
    5.         android:orientation="vertical"  
    6.   
    7.         android:layout_width="wrap_content"  
    8.   
    9.         android:layout_height="fill_parent">  
    10.        
    11.   
    12.         <GridView android:gravity="center"  
    13.   
    14.                 android:layout_gravity="center"  
    15.   
    16.                 android:id="@+id/menuGridChange"  
    17.                
    18.                 android:background="@drawable/menu_bg_frame"  
    19.   
    20.                 android:padding="5.0dip"  
    21.   
    22.                 android:layout_width="fill_parent"  
    23.   
    24.                 android:layout_height="wrap_content"  
    25.   
    26.                 android:horizontalSpacing="10.0dip"  
    27.     
    28.                 android:verticalSpacing="3.0dip"  
    29.   
    30.                 android:stretchMode="columnWidth"  
    31.   
    32.                 android:columnWidth="60.0dip"  
    33.   
    34.                 android:numColumns="auto_fit"/>  
    35.   
    36.                   
    37. </LinearLayout>  

           主要类:

    Java代码
    1. package com.yfz;   
    2.   
    3.   
    4. import android.app.Activity;   
    5. import android.app.AlertDialog;   
    6. import android.app.AlertDialog.Builder;   
    7. import android.content.Context;   
    8. import android.graphics.drawable.BitmapDrawable;   
    9. import android.os.Bundle;   
    10. import android.util.Log;   
    11. import android.view.ContextMenu;   
    12. import android.view.Gravity;   
    13. import android.view.LayoutInflater;   
    14. import android.view.Menu;   
    15. import android.view.MenuItem;   
    16. import android.view.View;   
    17. import android.view.ViewGroup;   
    18. import android.view.ContextMenu.ContextMenuInfo;   
    19. import android.widget.BaseAdapter;   
    20. import android.widget.GridView;   
    21. import android.widget.ImageView;   
    22. import android.widget.LinearLayout;   
    23. import android.widget.PopupWindow;   
    24. import android.widget.TextView;   
    25. import android.widget.LinearLayout.LayoutParams;   
    26.   
    27. public class MenuTest extends Activity {           
    28.   
    29.         private String TAG = this.getClass().getSimpleName();          
    30.   
    31.         private int[] resArray = new int[] {   
    32.                 R.drawable.icon_menu_addto, R.drawable.icon_menu_audioinfo,   
    33.                 R.drawable.icon_menu_findlrc, R.drawable.icon_menu_scan   
    34.         };           
    35.   
    36.         private String[] title = new String[]{   
    37.                 "添加歌曲", "歌曲信息", "查找歌词", "搜索歌词"  
    38.         };           
    39.   
    40.         private static boolean show_flag = false;           
    41.         private PopupWindow pw = null;           
    42.   
    43.         /** Called when the activity is first created. */  
    44.         @Override  
    45.         public void onCreate(Bundle savedInstanceState) {   
    46.             super.onCreate(savedInstanceState);   
    47.             setContentView(R.layout.main);   
    48.         }   
    49.   
    50.         @Override  
    51.   
    52.         public boolean onCreateOptionsMenu(Menu menu) {   
    53.                 Log.e(TAG, "------  onCreateOptionsMenu ------");   
    54.                 //用AlertDialog弹出menu   
    55.   
    56. //                View view = LayoutInflater.from(this).inflate(R.layout.menu, null);   
    57.   
    58. //                GridView grid1 = (GridView)view.findViewById(R.id.menuGridChange);   
    59.   
    60. //                grid1.setAdapter(new ImageAdapter(this));   
    61.   
    62. //                Builder build = new AlertDialog.Builder(this);   
    63.   
    64. //                build.setView(view);   
    65.   
    66. //                build.show();   
    67.                    
    68.                 LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);         
    69.   
    70.                 View view = inflater.inflate(R.layout.menu, null);   
    71.   
    72.                 GridView grid1 = (GridView)view.findViewById(R.id.menuGridChange);   
    73.   
    74.                 grid1.setAdapter(new ImageAdapter(this));                   
    75.   
    76.                 //用Popupwindow弹出menu   
    77.                 pw = new PopupWindow(view,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);                   
    78.   
    79.                 //NND, 第一个参数, 必须找个View   
    80.                 pw.showAtLocation(findViewById(R.id.tv), Gravity.CENTER, 0, 300);                   
    81.   
    82.                 return true;   
    83.         }   
    84.   
    85.         @Override  
    86.   
    87.         public boolean onOptionsItemSelected(MenuItem item) {   
    88.                 return super.onOptionsItemSelected(item);   
    89.        }   
    90.   
    91.         public class ImageAdapter extends BaseAdapter {                   
    92.                 private Context context;                   
    93.   
    94.                 public ImageAdapter(Context context) {   
    95.                         this.context = context;   
    96.                 }                   
    97.   
    98.                 @Override  
    99.                 public int getCount() {   
    100.                         return resArray.length;   
    101.                 }   
    102.   
    103.                 @Override  
    104.                 public Object getItem(int arg0) {   
    105.                         return resArray[arg0];   
    106.                 }   
    107.   
    108.                 @Override  
    109.                 public long getItemId(int arg0) {   
    110.                         return arg0;   
    111.                 }   
    112.   
    113.                 @Override  
    114.                 public View getView(int arg0, View arg1, ViewGroup arg2) {   
    115.                         LinearLayout linear = new LinearLayout(context);   
    116.   
    117.                         LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);   
    118.   
    119.                         linear.setOrientation(LinearLayout.VERTICAL);                           
    120.   
    121.                         ImageView iv = new ImageView(context);   
    122.   
    123.                         iv.setImageBitmap(((BitmapDrawable)context.getResources().getDrawable(resArray[arg0])).getBitmap());   
    124.   
    125.                         LinearLayout.LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);   
    126.   
    127.                         params2.gravity=Gravity.CENTER;   
    128.   
    129.                         linear.addView(iv, params2);                           
    130.   
    131.                         TextView tv = new TextView(context);   
    132.   
    133.                         tv.setText(title[arg0]);   
    134.   
    135.                         LinearLayout.LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);   
    136.   
    137.                         params3.gravity=Gravity.CENTER;                           
    138.   
    139.                         linear.addView(tv, params3);                           
    140.                         return linear;   
    141.                 }   
    142.         }   
    143. }  

            到此,大家是不是觉得半透明Menu效果也是比较好实现的呢?可以根据自己的需要对此实例进行修改以求更美观好用。

  • 相关阅读:
    fiber
    ACM用到的算法。先做个笔记,记一下
    matlab安装及破解
    银行家算法
    网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!
    心脏滴血漏洞复现(CVE-2014-0160)
    KMP算法分析
    利用BURPSUITE检测CSRF漏洞
    BURPSUITE爆破密码
    动态规划—最长回文子串LEETCODE第5题深度剖析
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3926316.html
Copyright © 2020-2023  润新知