日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > 處女男學(xué)Android(十二)---Android 菜單(Menu)詳解與應(yīng)用

處女男學(xué)Android(十二)---Android 菜單(Menu)詳解與應(yīng)用

來源:程序員人生   發(fā)布時間:2015-01-12 08:17:08 閱讀次數(shù):5324次



1、前言



轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/wlwlwlwl015/article/details/42170771

本篇blog將記錄1下Android中菜單的使用方法,雖然在新版本中推薦使用ActionBar去替換菜單,但我認(rèn)為菜單仍然是挺不錯的1種UI交互組件,比ActionBar好點1些,對手指不靈活的人比起來ActionBar右上角的那個方塊小按鈕,也許ta會更喜歡Menu呢,空話不多說,下面就具體介紹1下Android中關(guān)于Menu的使用方法。



2、創(chuàng)建第1個菜單



菜單有兩種創(chuàng)建方式,分別是:

  • 通過Java代碼創(chuàng)建菜單對象。
  • 通過xml資源文件定義菜單。

這里我想也沒必要多說,肯定應(yīng)當(dāng)選擇第2種情勢,在Activity中寫代碼去創(chuàng)建菜單必定致使程序代碼過于臃腫,而且也不容易查看和保護(hù),而第2種方法既容易視察菜單的結(jié)構(gòu),也下降了耦合性,下面是官方給出的將“Using a menu resource”作為最好實踐的理由,簡單看1下:


所以我這里就不浪費篇幅去記錄“通過代碼去創(chuàng)建菜單”了,主要記錄1下如何通過xml文件定義菜單資源和如何在Activity中援用并設(shè)置和使用菜單。


菜單的資源文件通常應(yīng)當(dāng)放在/res/menu目錄下,菜單資源的根元素通常是<menu.../>元素,并且它不需要指定任何屬性,僅是菜單資源文件的根標(biāo)簽而已。我們在eclipse中新建1個Android工程,在/res/menu下去new1個Menu Resource,可以看到Menu的基本結(jié)構(gòu):


可以看到<menu.../>元素內(nèi)可包括的子元素:

  • <group></group>
  • <item/>
下面分別說明1下這兩個標(biāo)簽的用法和屬性,首先是最經(jīng)常使用的<item/>,<item/>元素用于定義1個菜單項,<item/>元素中又可以包括新的<menu/>,而位于<item/>中的<menu/>自然就代表了指定<item/>的子菜單了。下面先看1下<item/>可指定的經(jīng)常使用屬性:


通常我們必須指定的屬性只有1個,就是android:title,其余的屬性都是可選的,這里我們創(chuàng)建的第1個菜單簡單1些,只給出id和title便可:
<?xml version="1.0" encoding="utf⑻"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/item_1" android:title="title1"/> <item android:id="@+id/item_2" android:title="title2"/> <item android:id="@+id/item_3" android:title="title3"/> <item android:id="@+id/item_4" android:title="title4"/> <item android:id="@+id/item_5" android:title="title5"/> <item android:id="@+id/item_6" android:title="title6"/> </menu>

寫好了資源文件以后,在Activity中需要重寫onCreateOptionsMenu去加載菜單,加載方式也很簡單,通過MenuInflater的inflate方法便可加載菜單,完全類似于我們LayoutInflater的用法。關(guān)于菜單Item的點擊事件需要在Activity中重寫onOptionsItemSelected,根據(jù)回調(diào)參數(shù)來判斷不同的Item從而進(jìn)行不同的處理,其實這些在新建Activity以后都會自動生成的,下面貼上這兩個方法的代碼,很簡單:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.my_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); switch (id) { case R.id.item_1: Toast.makeText(this, "item_1 has been clicked!", Toast.LENGTH_SHORT) .show(); ; break; case R.id.item_2: Toast.makeText(this, "item_2 has been clicked!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_3: Toast.makeText(this, "item_3 has been clicked!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_4: Toast.makeText(this, "item_4 has been clicked!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_5: Toast.makeText(this, "item_5 has been clicked!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_6: Toast.makeText(this, "item_6 has been clicked!", Toast.LENGTH_SHORT) .show(); break; } return true; }
最后看1下運行效果:



3、選項菜單(Options menu)和上下文菜單(Context menu)


google將菜單按功能特性分為了3種,分別是:選項菜單(Options menu)、上下文菜單(Context menu)和彈出式菜單(Popup menu),現(xiàn)在就分別介紹1下前兩個:選項菜單和上下文菜單。

a.選項菜單(Option menu)

首先看1下官方文檔中對option menu的簡介:
――――――――――――――――――――――――――――

――――――――――――――――――――――――――――
簡單翻譯1下,“選項菜單”是1個Activity中主要的菜單項的集合,在它上面應(yīng)當(dāng)放置有全局性影響的功能,例如:“搜索”、“寫郵件”和“設(shè)置”。說到這里我們差不多應(yīng)當(dāng)就可以對號入坐了選項菜單了,安卓系統(tǒng)就自帶了“選項菜單”,也就是下圖的這個菜單:

點擊手機的Menu鍵,彈出的就是我們所說的options menu了,再看1下菜單上提供的功能,分別是:墻紙(Wallpaper)、APP管理器(Manage apps)和系統(tǒng)設(shè)置(System settings),這也和文檔中提到的“放置全局性影響的功能”相吻合。但是由于從Android3.0版本開始,其實不要求手機上必須提供Menu鍵,而且有可能部份手機將不再提供Menu鍵(比如我的魅族MX4),在這類情況下,google推薦我們使用ActionBar去替換options menu這類需求。
示例代碼已寫過了,剛才“創(chuàng)建的第1個菜單”就是1個簡單標(biāo)準(zhǔn)的options menu了。

b.上下文菜單(Context menu)

首先看1下官方文檔對Context menu的概述:

重點是第1句話,簡單翻譯1下,context menu是1個浮動的菜單,當(dāng)用戶在某個view上履行長按操作時彈出。好了概念上就這么簡單,那末1般甚么情況下會用到它呢?其實這個具體看需求,不過官方也做了相干說明:

沒錯,常常用在ListView、GridView的Items上面,可想而知也確切如此,常常會有這類需求,長按ListView彈出1個dialog或1個menu,比如百度搜索中應(yīng)當(dāng)就是1個標(biāo)準(zhǔn)的context menu了,以下圖:

可以看到,當(dāng)我長按1條Item的時候,會彈出這樣的1個菜單,它就是context menu,下面就具體介紹1下context menu的創(chuàng)建方式。

與options menu類似,但是在Activity中還是有些許的差別,照舊來看1下官方文檔:

可以看到,第1步就是為我們的上下文菜單注冊1個View,也就是說當(dāng)我們長按哪一個View的時候才需要彈出菜單,當(dāng)我們希望ListView或GridView的items提供相同的菜單的話,那末直接傳1個ListView或GridView便可完成。下面的代碼就是模仿上面百度的那個菜單的,接下來逐一貼出代碼,首先是在Activity中為上下文菜單注冊1個View:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.lv_test); registerForContextMenu(lv); //為上下文菜單注冊1個ListView }
下面看1下接下來的需要做的事情,文檔中也已說的很清楚了:


可以看到,這里重寫的是onCreatContextMenu方法,而選項菜單重寫的是onOptionsMenu,這也就是它們最主要的區(qū)分了??梢钥吹竭@個方法其實不需要返回值,所以直接通過MenuInflater加載1下菜單的資源文件就OK了。

如果希望利用程序能夠為菜單提供響應(yīng),一樣的需要再重寫1個相應(yīng)方法,與options menu的類似但也有些許不同:
 
很簡單,不做單獨說明了,下面就看1下仿百度的上下文菜單的完全示例代碼。

首先是activity的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:id="@+id/sv_4lv" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/top_part" > </LinearLayout> <com.wl.view.MyListView android:id="@+id/lv_test" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:entries="@array/hero" > </com.wl.view.MyListView> </LinearLayout> </ScrollView> </LinearLayout>

menu的布局文件也很簡單:
<?xml version="1.0" encoding="utf⑻"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/item1" android:title="新窗口打開"/> <item android:id="@+id/item2" android:title="后臺打開"/> <item android:id="@+id/item3" android:title="選擇文本"/> <item android:id="@+id/item4" android:title="復(fù)制鏈接地址"/> <item android:id="@+id/item5" android:title="下載鏈接"/> </menu>

最后是Activity代碼:
package com.wl.contextmenudemo; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import com.wl.model.BaiduItem; import com.wl.view.MyListView; public class MainActivity extends Activity { private BaiduItem baiduItem; private Context context; private LayoutInflater inflater; private ScrollView sv; private MyListView mlv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; inflater = LayoutInflater.from(context); sv = (ScrollView) findViewById(R.id.sv_4lv); sv.smoothScrollTo(0, 0); MyListView lv = (MyListView) findViewById(R.id.lv_test); baiduItem = new BaiduItem(); lv.setAdapter(new Myadapter()); registerForContextMenu(lv); // 為上下文菜單注冊1個ListView } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub getMenuInflater().inflate(R.menu.my_menu_2, menu); } @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.item1: Toast.makeText(context, "新窗口打開!", Toast.LENGTH_SHORT).show(); break; case R.id.item2: Toast.makeText(context, "后臺打開!", Toast.LENGTH_SHORT).show(); break; case R.id.item3: Toast.makeText(context, "選擇文本!", Toast.LENGTH_SHORT).show(); break; case R.id.item4: Toast.makeText(context, "復(fù)制鏈接地址!", Toast.LENGTH_SHORT).show(); break; case R.id.item5: Toast.makeText(context, "下載鏈接!", Toast.LENGTH_SHORT).show(); break; } return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub return super.onCreateOptionsMenu(menu); } class Myadapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return baiduItem.items.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return baiduItem.items.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = inflater.inflate(R.layout.my_item_1, null); TextView title = (TextView) v.findViewById(R.id.tv_title); title.setText(baiduItem.items.get(position).getTitle()); TextView content = (TextView) v.findViewById(R.id.tv_content); content.setText(baiduItem.items.get(position).getContent()); TextView url = (TextView) v.findViewById(R.id.tv_url); url.setText(baiduItem.items.get(position).getUrlAndDate()); return v; } }; }

代碼中通過自定義ListView來處理和ScrollView滑動沖突,關(guān)于數(shù)據(jù)則通過封裝好的BaiduItem這個類直接提供,數(shù)據(jù)的初始化寫在這個類的靜態(tài)代碼塊中,由于只有5條數(shù)據(jù),所以adapter也沒有用ViewHolder優(yōu)化,整體很簡單,只是模仿那個百度的效果裝個B,重點還是理解1下context menu的適用處合,最后看1下運行效果圖:



4、彈出菜單(Popup menu)


看到pop這個詞很明顯的可以知道它肯定是類似于popupwindow,是1個彈出式的菜單,而且肯定也和popupwindow有很多相似的特性,照舊看1下官方文檔對popupmenu的概述:

簡單翻譯1下,popup menu是1個??吭诠潭╒iew上的模式菜單,如果該View下方有空間,那末彈出菜單將顯示在該View的下方,否則會顯示在該View的上方。不難理解popup menu是依附于1個View的,也就是說在指定View的上方or下方彈出,這類菜單1般會從頂部彈出或從底部彈出,在很多APP中都很常見這類菜單,比如微信主界面右上角的加號圖標(biāo),點擊就會彈出1個popupmenu。

接下來介紹1下popup menu的創(chuàng)建方式,同popup window很類似,僅需3步:
1.通過其構(gòu)造方法new PopupMenu(Context context,View anchor)創(chuàng)建下拉菜單,第2個參數(shù)即表示本菜單所依附的View。
2.調(diào)用MenuInflater的inflate()方法裝載menu的資源文件。
3.調(diào)用popup menu的show()方法來顯示菜單便可。
很簡單吧,也沒啥好說的,下面就模仿微信的那個彈出菜單做1個小例子,直接貼代碼。

Activity布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/ll_top_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#000" android:orientation="horizontal" android:padding="8dp" > <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:text="我不是微信" android:textColor="#ccc" android:textSize="16sp" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > <ImageButton android:id="@+id/ibtn_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_search" /> <ImageButton android:id="@+id/ibtn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:background="@drawable/ic_add" /> </LinearLayout> </LinearLayout> </LinearLayout>

Activity代碼:
package com.wl.menusdemo; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { private ImageButton ibtnAdd; private ImageButton ibtnSearch; private PopupMenu popMenu; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; ibtnAdd = (ImageButton) findViewById(R.id.ibtn_add); ibtnAdd.setOnClickListener(this); ibtnSearch = (ImageButton) findViewById(R.id.ibtn_search); } @Override public void onClick(View v) { // TODO Auto-generated method stub if (v == ibtnAdd) { popMenu = new PopupMenu(context, ibtnAdd); getMenuInflater().inflate(R.menu.pop_menu, popMenu.getMenu()); popMenu.show(); popMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.item_chart: Toast.makeText(context, "發(fā)起群聊!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_add_friend: Toast.makeText(context, "添加朋友!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_sao: Toast.makeText(context, "掃1掃!", Toast.LENGTH_SHORT) .show(); break; case R.id.item_idea: Toast.makeText(context, "意見反饋!", Toast.LENGTH_SHORT) .show(); break; } return false; } }); } } }

是否是超簡單的說,下面看1下運行效果:



5、模仿手機QQ的底部彈出菜單


介紹完了所有類型的菜單以后,最后再做1個練習(xí),可能我們也發(fā)現(xiàn)了菜單的樣式比較局限,1般很難做1些定制的樣式,所以說還有1種很不錯的解決方案就是不使用Menu的API,通過監(jiān)聽菜單鍵的KEY CODE來彈出1個popup window,這樣的話我們做1些個性化的樣式、動畫等等就沒有那末多限制了,在這里我就通過這類方式來模仿1下手機QQ的功能菜單,下面是效果圖:

可以看到,當(dāng)我們進(jìn)入QQ以后點擊手機的Menu鍵時,會從底部彈出圖中圈出的菜單,下面就結(jié)合popup window來實現(xiàn)這個效果,首先將需要做的事情拆分為3個步驟:
step 1
在Activity中重寫onKeyDown()方法,并通過KEY CODE來監(jiān)聽菜單鍵按下的事件,并在該事件中彈出1個popup window。
step 2
構(gòu)造popup window對象,并編寫布局文件代碼,設(shè)置樣式和動畫。
step 3
點擊菜單鍵時show這個popup window,點擊菜單鍵或popup window以外的區(qū)域時dismiss這個popup window。

好了,接下來就按步驟去實現(xiàn)它,首先是第1步,重寫onKeyDown()方法用來響應(yīng)菜單鍵的單擊,直接貼代碼:
package com.wl.menusdemo; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.KeyEvent; import android.widget.Toast; public class SecondActivity extends Activity { private Context context; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); context = this; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_MENU) { Toast.makeText(context, "準(zhǔn)備好,要彈出菜單了!", Toast.LENGTH_LONG).show(); } return true; } }

很簡單,看1下效果圖:



第2步和第3步1起說了,編寫popup window的布局文件代碼,我能想到的最簡單的辦法就是通過1組Button來實現(xiàn),然后需要為popupwindow添加1個彈出動畫,直接看代碼,下面分別是popupwindow的布局文件和Activity中的全部代碼。

popup_menu.xml:
<?xml version="1.0" encoding="utf⑻"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_ver_update" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/my_btn_selector_2" android:gravity="center" android:padding="5dp" android:text="版本更新" android:textColor="#62A6E7" android:textSize="20sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="2dp" android:background="#ccc" > </LinearLayout> <Button android:id="@+id/btn_help" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/my_btn_selector_3" android:gravity="center" android:padding="5dp" android:text="幫助與反饋" android:textColor="#62A6E7" android:textSize="20sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="2dp" android:background="#ccc" > </LinearLayout> <Button android:id="@+id/btn_exit_qq" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/my_btn_selector_4" android:gravity="center" android:padding="5dp" android:text="退出QQ" android:textColor="#62A6E7" android:textSize="20sp" /> <Button android:id="@+id/btn_undo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" android:background="@drawable/my_btn_selector" android:gravity="center" android:padding="5dp" android:text="取消" android:textColor="#62A6E7" android:textSize="20sp" /> </LinearLayout>

Activity:
package com.wl.menusdemo; import android.app.ActionBar.LayoutParams; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.PopupWindow; import android.widget.PopupWindow.OnDismissListener; import android.widget.Toast; public class SecondActivity extends Activity implements OnClickListener { private Context context; private PopupWindow popupWindow; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); context = this; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_MENU) { showMenu(); return true; } return super.onKeyDown(keyCode, event); } private void showMenu() { LayoutInflater inflater = getLayoutInflater(); View menuView = inflater.inflate(R.layout.pop_menu, null); Button button1 = (Button) menuView.findViewById(R.id.btn_ver_update); Button button2 = (Button) menuView.findViewById(R.id.btn_help); Button button3 = (Button) menuView.findViewById(R.id.btn_exit_qq); Button button4 = (Button) menuView.findViewById(R.id.btn_undo); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); button4.setOnClickListener(this); // 設(shè)置PopupWindow寬高 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); double screenWidth = metrics.widthPixels * 0.95; popupWindow = new PopupWindow(menuView, (int) screenWidth, LayoutParams.WRAP_CONTENT); // 想要讓PopupWindow中的控件能夠使用,就必須設(shè)置PopupWindow為focusable popupWindow.setFocusable(true); // 想做到在你點擊PopupWindow之外的區(qū)域時候讓PopupWindow消失就做以下兩步操作 // 1:設(shè)置setOutsideTouchable為ture,這個很容易理解吧,跟AlertDialog1樣的 popupWindow.setOutsideTouchable(true); popupWindow.setBackgroundDrawable(getResources().getDrawable( android.R.color.transparent)); popupWindow.setAnimationStyle(R.style.AnimationPreview); popupWindow.setOnDismissListener(onDismissListener); popupWindow.showAtLocation(getWindow().getDecorView(), android.view.Gravity.BOTTOM, 0, 0); // 設(shè)置父窗口透明度 WindowManager.LayoutParams wlp = getWindow().getAttributes(); wlp.alpha = 0.5f; getWindow().setAttributes(wlp); } private OnDismissListener onDismissListener = new OnDismissListener() { @Override public void onDismiss() { WindowManager.LayoutParams wlp = getWindow().getAttributes(); wlp.alpha = 1.0f; getWindow().setAttributes(wlp); } }; @Override public void onClick(View v) { // TODO Auto-generated method stub if (popupWindow != null && popupWindow.isShowing()) popupWindow.dismiss(); switch (v.getId()) { case R.id.btn_ver_update: Toast.makeText(context, "版本更新!", Toast.LENGTH_SHORT).show(); break; case R.id.btn_help: Toast.makeText(context, "幫助與反饋!", Toast.LENGTH_SHORT).show(); break; case R.id.btn_exit_qq: Toast.makeText(context, "退出QQ!", Toast.LENGTH_SHORT).show(); break; case R.id.btn_undo: Toast.makeText(context, "取消!", Toast.LENGTH_SHORT).show(); break; } } }

BINGO~結(jié)束了,最后看1下效果圖,相似度還不錯吧:


關(guān)于樣式的話,每一個按鈕都是通過selector+shape嵌套實現(xiàn)的,popup window彈出的時候還設(shè)置了1個非常簡單的補間動畫,背風(fēng)景直接用透明色值就OK了,下面把兩個動畫的資源文件和1個按鈕的樣式資源文件貼出來(其余的類似)。

anim_bottom_in.xml:
<?xml version="1.0" encoding="utf⑻"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="350" android:fromYDelta="100%" android:toYDelta="0.0" /> </set>

anim_bottom_out.xml:
<?xml version="1.0" encoding="utf⑻"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="350" android:fromYDelta="0.0" android:toYDelta="100%p" /> </set>

my_btn_selector.xml:
<?xml version="1.0" encoding="utf⑻"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false"><shape android:shape="rectangle"> <gradient android:endColor="#efffffff" android:startColor="#efffffff"></gradient> <!-- 設(shè)置內(nèi)填充 --> <padding android:bottom="7dp" android:left="7dp" android:right="7dp" android:top="7dp" /> <!-- 設(shè)置圓角矩形 --> <corners android:radius="8dp" /> </shape></item> <item android:state_pressed="true"><shape android:shape="rectangle"> <gradient android:endColor="#ecdcdcdc" android:startColor="#ecdcdcdc"></gradient> <!-- 設(shè)置內(nèi)填充 --> <padding android:bottom="7dp" android:left="7dp" android:right="7dp" android:top="7dp" /> <!-- 設(shè)置圓角矩形 --> <corners android:radius="8dp" /> </shape></item> </selector>

Over,如果新手朋友仔細(xì)看了本篇blog的話相信1定會有很多的收獲的~ 我個人有以下收獲:
1.學(xué)習(xí)了Android中的3種Menu的概念和簡單的使用方法(Options menu、Context menu、Popup menu)。
2.學(xué)習(xí)了Android簡單動畫的編寫和援用。
3.學(xué)習(xí)了selector和shape的嵌套。
4.學(xué)習(xí)并溫習(xí)了以下的幾個小知識點:改變popupwindow父窗體透明度、shape資源中關(guān)于4個corners的任意控制、根據(jù)DisplayMetrix來設(shè)置popupwindow的寬度、根據(jù)KEY CODE監(jiān)聽菜單鍵的動作、關(guān)于ScrollView嵌套ListView轉(zhuǎn)動沖突的問題等等。


6、總結(jié)


或許這1篇blog的標(biāo)題不夠吸引人,內(nèi)容也沒有別的大神寫的那末深入高端,但我認(rèn)為這算是我寫過的最認(rèn)真的博客之1了,用了很長時間。從翻譯文檔、修改圖片到錄制gif,對每個知識點和概念咬文嚼字,考慮再3,不放過每個細(xì)節(jié),總的來講我的收獲還是蠻大的,最少在我的下1個APP中我1定會用到上面寫的那個仿QQ的“菜單”。在今后的blog中我還會盡我最大的努力去做到“認(rèn)真”、“仔細(xì)”和“完善”,由于我是處女座。好了,空話不多說,繼續(xù)滾去加班寫服務(wù)端了,但同時Android的學(xué)習(xí)我也絕不會拉下的,以csdn為證!加油,Raito!


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国内免费av| 久久精品免费电影 | 精品一区二区国产 | 黄色电影免费看 | 国内成人自拍视频 | av在线不卡免费看 | 亚洲综合色站 | 国产网站在线免费观看 | 亚洲福利电影网 | 黄片毛片在线观看 | 99日在线视频 | 久久精品无码一区二区三区 | 国产hsck在线亚洲 | 在线观看国产麻豆 | 亚洲区久久 | 高清不卡一区 | 伊人精品久久 | 国产91久| 欧美成人精精品一区二区频 | 伊人91在线| 国产在线精品视频 | 亚洲精品一区二区三区在线观看 | 曰韩在线 | 国产精品精品视频 | 日韩欧美在线一区二区 | 国产一区二区在线看 | 日韩在线中文 | 国产精品毛片久久久久久 | av毛片久久久久午夜福利hd | 99精品视频在线观看免费 | 日韩免费三级 | 午夜影院在线 | 日韩在线观看中文字幕 | 成人亚洲一区 | 欧美不卡一区二区三区 | 毛片免费观看视频 | 欧美大吊视频 | 黄色大片日韩 | 毛片免费观看网站 | 日韩精品免费一区二区三区 | 亚洲区日韩 |