欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程自定義菜單實(shí)現(xiàn)方法詳解

 更新時(shí)間:2017年02月22日 14:23:01   作者:藍(lán)之風(fēng)  
這篇文章主要介紹了Android編程自定義菜單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android自定義菜單的布局、動(dòng)畫及功能相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下

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

在android開發(fā)的過(guò)程中系統(tǒng)自帶的菜單往往滿足不了開發(fā)中的一些需求,比如說(shuō)一排最多只能放置三個(gè)菜單,坐多只能放置6個(gè),再多的話就會(huì)折疊起來(lái),如果我們想再一排顯示4個(gè)或5個(gè)菜單那么就要自己想辦法處理。

這里我用布局的隱藏并加上動(dòng)畫來(lái)模擬菜單的效果。

要點(diǎn):

1、隱藏和顯示菜單,我使用了一個(gè)線性布局把菜單封裝起來(lái)。

<?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、模擬菜單的效果,增加動(dòng)畫,布局顯示的時(shí)候增加一個(gè)漸漸底部生氣的效果,隱藏的時(shí)候增加一個(gè)緩緩下落的效果,顯示菜單動(dòng)畫文件:

<?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>

隱藏菜單動(dòng)畫文件:

<?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>

動(dòng)畫調(diào)用:

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

3、控制菜單的隱藏和顯示,需要重寫三個(gè)方法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、實(shí)現(xiàn)菜單點(diǎn)擊時(shí)候被點(diǎn)擊菜單狀態(tài)的般變化,這里我使用了selector來(lái)實(shí)現(xiàn),菜單我使用ImageButton將selector賦值給ImageButton 的background即可:

一個(gè)菜單項(xiàng)

<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 文件內(nèi)容如下:

<?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、頁(yè)面的調(diào)用使用:<include>標(biāo)簽來(lái)進(jìn)行引用:

<?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>

這樣的話一個(gè)模擬的自定義菜單就基本完成了,菜單控制完整代碼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: 創(chuàng)建時(shí)間:2011-8-30 上午11:16:19
 * 說(shuō)   明:
 * 修改歷史:
 */
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);
    //返回首頁(yè)
    imgIndex.setOnClickListener(new OnClickListener(){
      public void onClick(View v) {
        //TODO do somthing
      }
    });
    //設(shè)置
    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
      }
    });
    //退出系統(tǒng)
    imgQuit.setOnClickListener(new OnClickListener(){
      public void onClick(View v) {
        //TODO do somthing
      }
    });
    //素材庫(kù)
    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);
  }
   /**
  * 顯示菜單欄, 重新實(shí)現(xiàn)的Option menu.
  * */
 private void showAppMenu() {
   if (menuShowAnimation == null) {
     menuShowAnimation = AnimationUtils
         .loadAnimation(mContext, R.anim.menuhide);
   }
   myLayout.startAnimation(menuShowAnimation);
   myLayout.setVisibility(View.VISIBLE);
 }
 /**
  * 隱藏菜單欄, 重新實(shí)現(xiàn)的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調(diào)用菜單完整代碼:

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: 創(chuàng)建時(shí)間:2011-8-30 上午11:13:14
 * 說(shuō)   明:
 * 修改歷史:
 */
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);
  }
}

實(shí)現(xiàn)的效果如下:

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論