国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程自定義菜單實現方法詳解

2019-12-12 03:39:40
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程自定義菜單實現方法。分享給大家供大家參考,具體如下:

在android開發的過程中系統自帶的菜單往往滿足不了開發中的一些需求,比如說一排最多只能放置三個菜單,坐多只能放置6個,再多的話就會折疊起來,如果我們想再一排顯示4個或5個菜單那么就要自己想辦法處理。

這里我用布局的隱藏并加上動畫來模擬菜單的效果。

要點:

1、隱藏和顯示菜單,我使用了一個線性布局把菜單封裝起來。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_alignParentBottom="true" android:background="@drawable/menubackground" android:layout_width="fill_parent" android:layout_height="144px" android:orientation="vertical" android:gravity="center" android:visibility="gone"   android:id="@+id/lines">   <LinearLayout android:orientation="horizontal"   android:gravity="center"   android:layout_width="fill_parent" android:layout_height="72px"   > <ImageButton   android:layout_marginLeft="8dip"   android:id="@+id/menu_btn_index"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_index_selector"   />  <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_news_selector"   android:id="@+id/menu_btn_news"   />  <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_lib_selector"   android:id="@+id/menu_btn_lib"   />    <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_add_selector"   android:id="@+id/menu_btn_add"   /> <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_set_selector"   android:id="@+id/menu_btn_set"   /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:gravity="center"   android:layout_width="fill_parent"   android:layout_height="72px"> <ImageButton   android:layout_marginLeft="8dip"   android:id="@+id/menu_btn_index"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_index_selector"   />  <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_news_selector"   android:id="@+id/menu_btn_news"   />  <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_lib_selector"   android:id="@+id/menu_btn_lib"   />  <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_add_selector"   android:id="@+id/menu_btn_add"   /> <ImageButton   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_quit_selector"   android:id="@+id/menu_btn_quit"   /> </LinearLayout></LinearLayout>

2、模擬菜單的效果,增加動畫,布局顯示的時候增加一個漸漸底部生氣的效果,隱藏的時候增加一個緩緩下落的效果,顯示菜單動畫文件:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <translate    android:fromXDelta="0"    android:toXDelta="0"    android:fromYDelta="00"    android:toYDelta="140"    android:duration="200" /></set>

隱藏菜單動畫文件:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <translate    android:fromXDelta="0"    android:toXDelta="0"    android:fromYDelta="140"    android:toYDelta="00"    android:duration="200" /></set>

動畫調用:

 /**  * 顯示菜單欄, 重新實現的Option menu.  * */ private void showAppMenu() {   if (menuShowAnimation == null) {     menuShowAnimation = AnimationUtils         .loadAnimation(mContext, R.anim.menuhide);   }   myLayout.startAnimation(menuShowAnimation);   myLayout.setVisibility(View.VISIBLE); } /**  * 隱藏菜單欄, 重新實現的Option menu.  * */ private void hideAppMenu() {   myLayout.setVisibility(View.GONE);   if (menuHideAnimation == null)     menuHideAnimation =AnimationUtils         .loadAnimation(mContext, R.anim.menushow);   myLayout.startAnimation(menuHideAnimation); }

3、控制菜單的隱藏和顯示,需要重寫三個方法public boolean onCreateOptionsMenu(Menu menu),
public boolean dispatchKeyEvent(KeyEvent event) 和public boolean dispatchTouchEvent(MotionEvent event)

@Override  public boolean onCreateOptionsMenu(Menu menu) {    if(mCustomMenu==null)      mCustomMenu=new CustomMenu(CustomMenuActivity.this,CustomMenuActivity.this);    mCustomMenu.CreateMenu();    return false;  }  @Override  public boolean dispatchKeyEvent(KeyEvent event) {    if(mCustomMenu!=null)      return mCustomMenu.dispatchKeyEvent(event,super.dispatchKeyEvent(event));    return super.dispatchKeyEvent(event);  }  @Override  public boolean dispatchTouchEvent(MotionEvent event) {    if(mCustomMenu!=null)      return mCustomMenu.dispatchTouchEvent(event,super.dispatchTouchEvent(event));    return super.dispatchTouchEvent(event);  }

4、實現菜單點擊時候被點擊菜單狀態的般變化,這里我使用了selector來實現,菜單我使用ImageButton將selector賦值給ImageButton 的background即可:

一個菜單項

<ImageButton   android:layout_marginLeft="8dip"   android:id="@+id/menu_btn_index"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/menu_index_selector"   />

menu_index_selector 文件內容如下:

<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2009 The Android Open Source Project  Licensed under the Apache License, Version 2.0 (the "License");  you may not use this file except in compliance with the License.  You may obtain a copy of the License at   http://www.apache.org/licenses/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License.--><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_window_focused="false"  android:drawable="@drawable/menu_index" /> <item android:state_pressed="true"  android:drawable="@drawable/menu_index1" /> <item android:state_focused="true"  android:drawable="@drawable/menu_index1" /> <item   android:drawable="@drawable/menu_index" /></selector>

5、頁面的調用使用:<include>標簽來進行引用:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include layout="@layout/menu_layout"/> </RelativeLayout>

這樣的話一個模擬的自定義菜單就基本完成了,菜單控制完整代碼java類:

package com.demo.utils;import android.app.Activity;import android.content.Context;import android.content.res.Resources;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageButton;import android.widget.LinearLayout;import com.demo.HelloWorld.R;/** * @author Administrator *   xsl xushilin@kingtoneinfo.com * @version: 創建時間:2011-8-30 上午11:16:19 * 說   明: * 修改歷史: */public class CustomMenu {  private LinearLayout myLayout;  private Context mContext;  private Activity mActivity;  private Animation menuShowAnimation = null;  private Animation menuHideAnimation = null;  private Resources res;  public int screen_height;  private ImageButton imgIndex,imgSet,imgNews,imgAdd,imgQuit,imgLib;  public CustomMenu(Context context,Activity activity){    mContext=context;    mActivity=activity;    res = mContext.getResources();    screen_height = res.getDisplayMetrics().heightPixels;    myLayout=(LinearLayout)activity.findViewById(R.id.lines);    imgIndex=(ImageButton)activity.findViewById(R.id.menu_btn_index);    imgSet=(ImageButton)activity.findViewById(R.id.menu_btn_set);    imgNews=(ImageButton)activity.findViewById(R.id.menu_btn_news);    imgAdd=(ImageButton)activity.findViewById(R.id.menu_btn_add);    imgQuit=(ImageButton)activity.findViewById(R.id.menu_btn_quit);    imgLib=(ImageButton)activity.findViewById(R.id.menu_btn_lib);    //返回首頁    imgIndex.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });    //設置    imgSet.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });    //查詢    imgNews.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });    //編輯    imgAdd.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });    //退出系統    imgQuit.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });    //素材庫    imgLib.setOnClickListener(new OnClickListener(){      public void onClick(View v) {        //TODO do somthing      }    });  }  public void CreateMenu(){    if(myLayout.getVisibility()==View.GONE)      showAppMenu();      //myLayout.setVisibility(View.VISIBLE);    else      hideAppMenu();      //myLayout.setVisibility(View.GONE);  }   /**  * 顯示菜單欄, 重新實現的Option menu.  * */ private void showAppMenu() {   if (menuShowAnimation == null) {     menuShowAnimation = AnimationUtils         .loadAnimation(mContext, R.anim.menuhide);   }   myLayout.startAnimation(menuShowAnimation);   myLayout.setVisibility(View.VISIBLE); } /**  * 隱藏菜單欄, 重新實現的Option menu.  * */ private void hideAppMenu() {   myLayout.setVisibility(View.GONE);   if (menuHideAnimation == null)     menuHideAnimation =AnimationUtils         .loadAnimation(mContext, R.anim.menushow);   myLayout.startAnimation(menuHideAnimation); } public boolean dispatchTouchEvent(MotionEvent event,boolean b) {    if (myLayout.getVisibility() == View.VISIBLE) {      int y = (int) event.getRawY();      if (y < screen_height - myLayout.getHeight()) {        hideAppMenu();        return true;      }    }    return b; } public boolean dispatchKeyEvent(KeyEvent event,boolean b) {   int act = event.getAction();   int code = event.getKeyCode();   // app menu like option menu   if (code == KeyEvent.KEYCODE_MENU){     if (act == KeyEvent.ACTION_DOWN){       if (myLayout.getVisibility() == View.VISIBLE) {         hideAppMenu();       } else {         showAppMenu();       }       return true;     }   }else if (code == KeyEvent.KEYCODE_BACK){     if (myLayout.getVisibility() == View.VISIBLE) {       hideAppMenu();       return true;     }   }   return b; }}

activity調用菜單完整代碼:

package com.demo.ui;import com.demo.HelloWorld.R;import com.demo.utils.CustomMenu;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.view.Menu;import android.view.MotionEvent;/** * @author XSL *   xsl xushilin@kingtoneinfo.com * @version: 創建時間:2011-8-30 上午11:13:14 * 說   明: * 修改歷史: */public class CustomMenuActivity extends Activity {  private CustomMenu mCustomMenu=null;  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.custom_menu);  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {    if(mCustomMenu==null)      mCustomMenu=new CustomMenu(CustomMenuActivity.this,CustomMenuActivity.this);    mCustomMenu.CreateMenu();    return false;  }  @Override  public boolean dispatchKeyEvent(KeyEvent event) {    if(mCustomMenu!=null)      return mCustomMenu.dispatchKeyEvent(event,super.dispatchKeyEvent(event));    return super.dispatchKeyEvent(event);  }  @Override  public boolean dispatchTouchEvent(MotionEvent event) {    if(mCustomMenu!=null)      return mCustomMenu.dispatchTouchEvent(event,super.dispatchTouchEvent(event));    return super.dispatchTouchEvent(event);  }}

實現的效果如下:

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android布局layout技巧總結》、《Android視圖View技巧總結》、《Android編程之activity操作技巧總結》、《Android操作json格式數據技巧總結》、《Android資源操作技巧匯總》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁东县| 鄱阳县| 治县。| 舞阳县| 拉萨市| 林口县| 凤城市| 东光县| 古交市| 华蓥市| 汉沽区| 阜宁县| 勐海县| 梨树县| 望谟县| 出国| 泗阳县| 定陶县| 宁化县| 景德镇市| 松潘县| 玉环县| 四子王旗| 清苑县| 邯郸县| 同德县| 汤原县| 沈丘县| 大悟县| 乌什县| 永丰县| 石阡县| 张北县| 舟山市| 嘉禾县| 峡江县| 历史| 蒙阴县| 永年县| 英山县| 乌拉特中旗|