Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android5.0多種側滑欄效果

android5.0多種側滑欄效果

編輯:關於Android編程

1.普通側滑

效果圖:這裡寫圖片描述

思路:通過自定義View繼承HorizontalScrollView,然後重寫onMeasure(),onLayout(),onTouchEvent()

方法並設置menu(通過動畫使menu開始時處於隱藏狀態)布局和content布局。(注意:使用ViewHelper類需要導入nineoldandroids-2.4.0.jar包)

menu(left_menu)布局代碼:



    
        
            
            
        
        
            
            
        
        
            
            
        
        
            
            
        
        
            
            
        
    

content(activity_main)布局代碼:



    
        
            
            

自定義attr.xml文件代碼:



    
    
        
    

自定義SlidingMenu代碼:

public class SlidingMenu extends HorizontalScrollView {
    private LinearLayout mWapper;
    private ViewGroup mMenu;//菜單布局
    private ViewGroup mContent;//內容布局
    private int mScreenWidth;//屏幕寬度
    private int mMenuRightPadding=50;
    private boolean once;
    private int mMenuWidth;
    private boolean isOpen;

    public SlidingMenu(Context context) {
       this(context, null);
    }

    /**
     * 未使用自定義屬性時,調用
     * @param context
     * @param attrs
     */
    public SlidingMenu(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    /**
     * 自定義了屬性且使用時,調用次構造方法
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //獲取定義的屬性的數組
        TypedArray typedValue=context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyleAttr, 0);
        int n=typedValue.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);
    }

    public void openMenu(){
        if(isOpen)return;
        this.smoothScrollTo(0,0);
        isOpen=true;
    }

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

    //切換菜單
    public void toggle(){
        if(isOpen){
            closeMenu();
        }else {
            openMenu();
        }
    }
}

主文件代碼:

public class MainActivity extends AppCompatActivity {
    private SlidingMenu mleftMenu;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mleftMenu= (SlidingMenu) findViewById(R.id.id_menu);
        textView= (TextView) findViewById(R.id.iv_text);
        //menu的第一個Item的點擊事件,可不寫
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mleftMenu.toggle();
            }
        });
    }

    public void toogleMenu(View view){
        mleftMenu.toggle();
    }
}

2.抽屜式側滑(一)

效果圖:這裡寫圖片描述

思路:在原來的基礎上,在自定義View文件中重寫onScrollChanged()方法

添加代碼:

/**
     * 滾動時發生
     * @param l
     * @param t
     * @param oldl
     * @param oldt
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        //調用屬性動畫,設置TranslateX,l值為menu隱藏的寬度,menu由完全隱藏變為完全可見,變化梯度                scale由1~0,menu偏移量由大到小;
        float scale=l*1.0f/mMenuWidth; //1~0
        ViewHelper.setTranslationX(mMenu, mMenuWidth * scale);
    }

3.抽屜式側滑(二)

效果圖:這裡寫圖片描述

思路:在一的基礎上通過設置menu的縮放效果,content的縮放效果和縮放中心實現。

實現代碼:

/**
     * 滾動發生
     * @param l
     * @param t
     * @param oldl
     * @param oldt
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        //調用屬性動畫,設置TranslateX,l值為menu隱藏的寬度,menu由完全隱藏變為完全可見,變化梯度scale由1~0,menu偏移量由大到小;
        float scale=l*1.0f/mMenuWidth; //1~0
//        ViewHelper.setTranslationX(mMenu, mMenuWidth * scale);
        float leftScale=1.0f-scale*0.3f;  //0.7~1.0
        float leftAlpha=0.6f+0.4f*(1-scale); //0.6~1.0
        float rightScale=0.7f+0.3f*scale; //1.0~0.7
        //縮放動畫0.7~1.0
        ViewHelper.setScaleX(mMenu, leftScale);
        ViewHelper.setScaleY(mMenu, leftScale);
        //透明度變化0.6~1.0
        ViewHelper.setAlpha(mMenu, leftAlpha);
        ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.7f);
        ViewHelper.setPivotX(mContent, 0);
        ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);
        //縮放動畫1.0~0.7
        ViewHelper.setScaleX(mContent, rightScale);
        ViewHelper.setScaleY(mContent,rightScale);
    }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved