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

首頁 > 系統(tǒng) > Android > 正文

Android使用自定義控件HorizontalScrollView打造史上最簡單的側(cè)滑菜單

2020-04-11 10:51:27
字體:
供稿:網(wǎng)友

側(cè)滑菜單在很多應(yīng)用中都會見到,最近QQ5.0側(cè)滑還玩了點花樣~~對于側(cè)滑菜單,一般大家都會自定義ViewGroup,然后隱藏菜單欄,當手指滑動時,通過Scroller或者不斷的改變leftMargin等實現(xiàn);多少都有點復(fù)雜,完成以后還需要對滑動沖突等進行處理~~今天給大家?guī)硪粋€簡單的實現(xiàn),史上最簡單有點夸張,但是的確是我目前遇到過的最簡單的一種實現(xiàn)~~~

1、原理分析

既然是側(cè)滑,無非就是在巴掌大的屏幕,塞入大概兩巴掌大的布局,需要滑動可以出現(xiàn)另一個,既然這樣,大家為啥不考慮使用Android提供的HorizontalScrollView呢~

如果使用HorizontalScrollView,還需要在ACTION_DOWN , ACTION_MOVE里面去監(jiān)聽,判斷,不斷改變控件位置了么? NO?。?!HorizontalScrollView本身就帶了滑動的功能~~

還需要自己的手動處理各種沖突么?NO!??!當然了,還是需要了解下事件分發(fā)機制的~~~

2、效果圖

嗯,主界面搞了QQ一張圖片,左邊盜用了一兄弟的布局文件~~罪過~~ 誰有好看的布局、圖片、圖標神馬的,可以給我發(fā)點,感激~

3、布局文件

<com.example.zhy_slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="fill_parent" android:scrollbars="none" > <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:orientation="horizontal" > <include layout="@layout/layout_menu" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/qq" > </LinearLayout> </LinearLayout> </com.example.zhy_slidingmenu.SlidingMenu> 

首先是我們的自定義View,里面一個方向水平的LinearLayout,然后就是一個是菜單的布局,一個是主布局了~

4、自定義SlidingMenu

接下來就是我們最核心的代碼了~

package com.example.zhy_slidingmenu; import android.content.Context; import android.util.AttributeSet; import android.util.TypedValue; import android.view.MotionEvent; import android.view.ViewGroup; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import com.zhy.utils.ScreenUtils; public class SlidingMenu extends HorizontalScrollView { /** * 屏幕寬度 */ private int mScreenWidth; /** * dp */ private int mMenuRightPadding = 50; /** * 菜單的寬度 */ private int mMenuWidth; private int mHalfMenuWidth; private boolean once; public SlidingMenu(Context context, AttributeSet attrs) { super(context, attrs); mScreenWidth = ScreenUtils.getScreenWidth(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { /** * 顯示的設(shè)置一個寬度 */ if (!once) { LinearLayout wrapper = (LinearLayout) getChildAt(0); ViewGroup menu = (ViewGroup) wrapper.getChildAt(0); ViewGroup content = (ViewGroup) wrapper.getChildAt(1); // dp to px mMenuRightPadding = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, mMenuRightPadding, content .getResources().getDisplayMetrics()); mMenuWidth = mScreenWidth - mMenuRightPadding; mHalfMenuWidth = mMenuWidth / 2; menu.getLayoutParams().width = mMenuWidth; content.getLayoutParams().width = mScreenWidth; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (changed) { // 將菜單隱藏 this.scrollTo(mMenuWidth, 0); once = true; } } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { // Up時,進行判斷,如果顯示區(qū)域大于菜單寬度一半則完全顯示,否則隱藏 case MotionEvent.ACTION_UP: int scrollX = getScrollX(); if (scrollX > mHalfMenuWidth) this.smoothScrollTo(mMenuWidth, 0); else this.smoothScrollTo(0, 0); return true; } return super.onTouchEvent(ev); } }

哈哈,完工~上面的演示圖,就用到這么點代碼~~

代碼怎么樣,短不短~除了設(shè)置寬度這些雜七雜八的代碼~正在處理滑動的代碼不過10行~~我說史上最簡單不為過吧~

嗯,由于代碼過于短,就不解釋了,大家自己看下注釋~

5、擴展

嗯,就下來,我們完善下程序,我準備首先把菜單布局里面改成ListView來證明我們是沒有沖突的;然后添加一個屬性讓用戶配置菜單距離右邊的邊距的值;再對外公布一個方法,點擊自動打開菜單,供用戶點擊某個按鈕,菜單慢慢滑出來~

1、添加自定義屬性

a、首先在values文件夾下新建一個attr.xml,寫入以下內(nèi)容:

<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="rightPadding" format="dimension" /> <declare-styleable name="SlidingMenu"> <attr name="rightPadding" /> </declare-styleable> </resources> 

b、在布局中聲明命名空間和使用屬性

定義完了,肯定要使用么。

<com.example.zhy_slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu" android:layout_width="wrap_content" android:layout_height="fill_parent" android:scrollbars="none" zhy:rightPadding="100dp" > 

可以看到我們的命名空間:xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu" 是http://schemas.android.com/apk/res/加上我們的包名;

我們的屬性:zhy:rightPadding="100dp"這里我設(shè)置了100dp;
注:很多人問我,沒有提示咋辦,這樣,你clean下項目,如果你運氣好,就有提示了,嗯,運氣好~

c、在我們自定義類中獲得屬性

public SlidingMenu(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScreenWidth = ScreenUtils.getScreenWidth(context); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.SlidingMenu_rightPadding: // 默認50 mMenuRightPadding = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 50f, getResources().getDisplayMetrics()));// 默認為10DP break; } } a.recycle(); }

在三個參數(shù)的構(gòu)造方法中,通過TypeArray獲取就行了~

好了,這樣就行了~如果你又很多自定義屬性,按照上面的步驟來就行了~~

2、對外公布一個打開菜單的方法

首先定義一個boolean isOpen變量,用來標識我們當前菜單的狀態(tài)~~然后記得在ACTION_UP的時候改變下狀態(tài):

case MotionEvent.ACTION_UP: int scrollX = getScrollX(); if (scrollX > mHalfMenuWidth) { this.smoothScrollTo(mMenuWidth, 0); isOpen = false; } else { this.smoothScrollTo(0, 0); isOpen = true; } return true; }

下面開始添加方法:

/** * 打開菜單 */ public void openMenu() { if (isOpen) return; this.smoothScrollTo(0, 0); isOpen = true; } /** * 關(guān)閉菜單 */ public void closeMenu() { if (isOpen) { this.smoothScrollTo(mMenuWidth, 0); isOpen = false; } } /** * 切換菜單狀態(tài) */ public void toggle() { if (isOpen) { closeMenu(); } else { openMenu(); } }

順手多添加了兩個。。。

下面,我們挑一個進行測試:

主布局多添加一個按鈕,用于觸發(fā)toggleMenu()方法

主Activity

public class MainActivity extends Activity { private SlidingMenu mMenu ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); mMenu = (SlidingMenu) findViewById(R.id.id_menu); } public void toggleMenu(View view) { mMenu.toggle(); } }

好了,看下現(xiàn)在的效果圖:

我們把padding改成了100dp~

然后點擊我們的按鈕,看哈效果~~

3、添加ListView測試

好了~~ListView也測試完了~~大家可以根據(jù)自己的需求各種修改~~

對了,今天測試用QQ的目的是為了,下次我要拿上面的代碼,改造和QQ5.0一模一樣的效果,大家有興趣可以提前試一試,QQ的菜單好像是隱藏在主界面下面一樣,給人感覺不是劃出來的,我們這個例子也能做出那樣的效果,拭目以待吧;剩下就是各種縮放,透明度的動畫了~~~

以上內(nèi)容是小編給大家分享的Android使用自定義控件HorizontalScrollView打造史上最簡單的側(cè)滑菜單,希望對大家有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 临漳县| 交城县| 馆陶县| 多伦县| 岱山县| 天门市| 泗洪县| 北安市| 什邡市| 聊城市| 成安县| 台南县| 博罗县| 丰都县| 永寿县| 石河子市| 沅陵县| 拜城县| 漯河市| 达州市| 宣城市| 定陶县| 隆回县| 无锡市| 香格里拉县| 凤阳县| 文安县| 兴义市| 道真| 宁国市| 锡林郭勒盟| 五峰| 阿拉尔市| 阳信县| 福州市| 赞皇县| 平凉市| 娄底市| 泸定县| 峨眉山市| 保定市|