Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 側滑菜單

側滑菜單

編輯:關於Android編程

菜單策劃:
原理:使用控件繼承HorizontalScrollView,因為HorizontalScrollView提供了水平側滑的效果,然後測量菜單和內容界面的各個屬性,如果想實現動畫效果,則必須加入第三方包nineoldandroids-2.4.0.jar。

重寫HorizontalScrollView的onMeasure(),onTouchEvent(),onLayout(),onScrollChanged()等方法

本次實現了自定義側滑,和修改側滑菜單顯示的寬度

left_menu.xml




    

        

            

            
        

        

            

            
        

        

            

            
        

        

            

            
        

        

            

            
        

        

            

            
        
    





activity_main.xml




    
     

            

            
SlidingMenu.java:


public class SlidingMenu extends HorizontalScrollView {


    private LinearLayout mWapper;           //總的布局View
    private ViewGroup mMenu;                //子View 菜單
    private ViewGroup mContent;             //子View 內容,也就是QQ那部分的內容

    private int mScreenWidth;               //屏幕寬度

    private int mMenuRightPadding = 50;         //dp,菜單距離內容的距離



    private boolean isOpen;                    //實現打開菜單

    private int mMenuWidth ;                  //菜單寬度


    public SlidingMenu(Context context) {
        this(context,null);
        // TODO Auto-generated constructor stub
    }


    public SlidingMenu(Context context, AttributeSet attrs) {
        this(context, attrs,0);
        // TODO Auto-generated constructor stub
    }
    /**
     * 當使用自定義屬性的時候,調用
     * @param context
     * @param attrs
     * @param defStyle
     */
    public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub

        //獲取自定義屬性
        TypedArray ta = context.getTheme().obtainStyledAttributes(attrs,
                R.styleable.SlidingMenu,defStyle,0);

        int n = ta.getIndexCount();
        for(int i=0;i= mMenuWidth / 2){
                this.smoothScrollTo(mMenuWidth, 0);           //偏移一個菜單的寬度,也就是隱藏
                isOpen = false;
            }else{
                this.smoothScrollTo(0, 0);
                isOpen = true;
            }
            return true;
        }
        return super.onTouchEvent(ev);

    }


    /**
     * 設置偏移量,將Menu隱藏
     */

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
        super.onLayout(changed, l, t, r, b);

        if(changed){
            this.scrollTo(mMenuWidth, 0);
        }
    }


    /**
     * 打開菜單
     */

    public void openMenu(){

        if(isOpen){
            return;
        }
        this.smoothScrollTo(0, 0);
    }


    public void closedMenu(){

        if(!isOpen){
            return;
        }
        this.smoothScrollTo(mMenuWidth, 0);
        isOpen = false;
    }

    /**
     * 切換菜單
     */
    public void toggle(){

        if(isOpen){

            closedMenu();

        }else{

            openMenu();
        }
    }


    /**
     * 滾動時的所要設置的效果
     */

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        // TODO Auto-generated method stub
        super.onScrollChanged(l, t, oldl, oldt);

        float scale = l* 1.0f / mMenuWidth;

//以下注釋的部分實現了動態效果        
//      float rightScale = 0.7f + 0.3f * scale;
//      float leftScale = 1.0f - scale * 0.3f;
//      float leftAlpha = 0.6f + 0.4f * (1 - scale);

        ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.8f);//這個表示只是保留0.8f的寬度
//      ViewHelper.setTranslationX(mMenu, mMenuWidth * scale );//這個也就是設置了定點的坐標


//      ViewHelper.setScaleX(mMenu, leftScale);
//      ViewHelper.setScaleY(mMenu, leftScale);
//      ViewHelper.setAlpha(mMenu, leftAlpha);

        //設置縮放的中心點
//      ViewHelper.setPivotX(mContent, 0);
//      ViewHelper.setPivotY(mContent, mContent.getHeight()/2);
//      ViewHelper.setScaleX(mContent, rightScale);
//      ViewHelper.setScaleY(mContent, rightScale);
    }


}
MainActivity.java

public class MainActivity extends Activity {

    private SlidingMenu leftMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.mian_activity);

        leftMenu = (SlidingMenu)findViewById(R.id.id_menu);

    }


    public void toggleMenu(View v){
        //實現了菜單切換
        leftMenu.toggle();
    }



}

實現效果如下:

這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved