西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開發(fā)Android → Android開發(fā)實(shí)現(xiàn)qqminihd 左右滑動(dòng)菜單效果

Android開發(fā)實(shí)現(xiàn)qqminihd 左右滑動(dòng)菜單效果

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/10/17 8:18:00字體大。A-A+

作者:佚名點(diǎn)擊:148次評(píng)論:0次標(biāo)簽: Android開發(fā)

  • 類型:編程工具大。13.8M語(yǔ)言:英文 評(píng)分:5.5
  • 標(biāo)簽:
立即下載

觀察qqminihd界面,發(fā)現(xiàn)其界面能夠左右滑動(dòng)來(lái)實(shí)現(xiàn)兩側(cè)菜單效果。

自定義Layout:ScrollLayout.java

直接貼出代碼:

  1 package grimbo.android.demo.slidingmenu;
  2
  3 import android.content.Context;
  4 import android.util.AttributeSet;
  5 import android.util.Log;
  6 import android.view.GestureDetector;
  7 import android.view.GestureDetector.OnGestureListener;
  8 import android.view.MotionEvent;
  9 import android.view.View;
10 import android.view.ViewConfiguration;
11 import android.view.animation.AnimationUtils;
12 import android.widget.LinearLayout;
13 import android.widget.Scroller;
14
15 public class ScrollLayout extends LinearLayout {
16
17 //    private static final String TAG = "scroller";
18
19     private Scroller scroller;
20
21     private int currentScreenIndex;
22
23     private GestureDetector gestureDetector;
24
25     // 設(shè)置一個(gè)標(biāo)志位,防止底層的onTouch事件重復(fù)處理UP事件
26     private boolean fling;
27
28     /**
29      * 菜單欄的寬度
30      */
31     int menuWidth=80;
32    
33     /**
34      * 顯示左邊菜單
35      * 否則顯示右邊菜單
36      */
37     private boolean showLeft=true;
38    
39     /**
40      * 滾出邊界監(jiān)聽器
41      */
42     private OnScrollSideChangedListener scrollSideChangedListener;
43    
44     public Scroller getScroller() {
45             return scroller;
46     }
47
48     public OnScrollSideChangedListener getScrollSideChangedListener() {
49         return scrollSideChangedListener;
50     }
51
52     public void setScrollSideChangedListener(
53             OnScrollSideChangedListener scrollSideChangedListener) {
54         this.scrollSideChangedListener = scrollSideChangedListener;
55     }
56
57     public ScrollLayout(Context context, AttributeSet attrs) {
58             super(context, attrs);
59             initView(context);
60     }
61
62     public ScrollLayout(Context context) {
63             super(context);
64             initView(context);
65     }
66
67     private void initView(final Context context) {
68             this.scroller = new Scroller(context,AnimationUtils.loadInterpolator(context,
69                     android.R.anim.overshoot_interpolator));
70
71             this.gestureDetector = new GestureDetector(new OnGestureListener() {
72
73                     @Override
74                     public boolean onSingleTapUp(MotionEvent e) {
75                             return false;
76                     }
77
78                     @Override
79                     public void onShowPress(MotionEvent e) {
80                     }
81
82                     @Override
83                     public boolean onScroll(MotionEvent e1, MotionEvent e2,
84                                     float distanceX, float distanceY) {
85
86                             {// 防止向第一頁(yè)之前移動(dòng)
87                                 if(1==currentScreenIndex)
88                                 {
89                                     int screenLeft=getWidth()-menuWidth;
90                                     if(showLeft && getScrollX()>screenLeft)
91                                     {
92                                         showLeft=false;
93 //                                        Log.e("TAG","顯示右邊菜單欄");
94                                         if(null!=scrollSideChangedListener)
95                                             scrollSideChangedListener.onScrollSideChanged(ScrollLayout.this, showLeft);
96                                     }
97                                     else if(!showLeft && getScrollX()<screenLeft)
98                                     {
99                                         showLeft=true;
100 //                                        Log.e("TAG","顯示左邊菜單欄");
101                                         if(null!=scrollSideChangedListener)
102                                             scrollSideChangedListener.onScrollSideChanged(ScrollLayout.this, showLeft);
103                                     }
104                                 }
105                                
106                                     fling = true;
107                                     scrollBy((int) distanceX, 0);
108 //                                    Log.d("TAG", "on scroll>>>>>>>>>>>>>>>>>移動(dòng)<<<<<<<<<<<<<<>>>");
109                             }
110                             return true;
111                     }
112
113                     @Override
114                     public void onLongPress(MotionEvent e) {
115                     }
116
117                     @Override
118                     public boolean onFling(MotionEvent e1, MotionEvent e2,
119                                     float velocityX, float velocityY) {
120                        
121                             if (Math.abs(velocityX) > ViewConfiguration.get(context)
122                                             .getScaledMinimumFlingVelocity())
123                             {// 判斷是否達(dá)到最小輕松速度,取絕對(duì)值的
124                                 fling = true;
125                                 snapToDestination();
126 //                                Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>滑動(dòng)<<<<<<<<<<<<<<>>>");
127                             }
128
129                             return true;
130                     }
131
132                     @Override
133                     public boolean onDown(MotionEvent e) {
134                             return false;
135                     }
136             });
137            
138     }
139     //每一個(gè)屏的邊界值
140     //0----[getWidth()-20]----[2*getWidth()-20]-----[3*getWidth()-40]
141    
142    
143     @Override
144     protected void onLayout(boolean changed, int left, int top, int right,
145                     int bottom) {
146             /**
147              * 設(shè)置布局,將子視圖順序橫屏排列
148              */
149             super.onLayout(changed, left, top, right, bottom);
150             int move=getWidth()-menuWidth;
151             for (int i = 0; i < getChildCount(); i++)
152             {
153                     View child = getChildAt(i);
154 //                    child.setVisibility(View.VISIBLE);
155                     //移動(dòng)一定的距離
156                     child.layout(child.getLeft()+move,child.getTop(),child.getRight()+move,child.getBottom());
157             }
158     }
159
160     @Override
161     public void computeScroll() {
162             if (scroller.computeScrollOffset()) {
163 //                    Log.d(TAG, ">>>>>>>>>>computeScroll>>>>>"+scroller.getCurrX());
164                     scrollTo(scroller.getCurrX(), 0);
165                     postInvalidate();
166             }
167     }
168
169     @Override
170     public boolean onTouchEvent(MotionEvent event) {
171            
172             float x2s=getScrollX()+event.getX();
173            
174             if(x2s<getWidth()-menuWidth || x2s>2*getWidth()-menuWidth)
175             {//動(dòng)作在區(qū)域外面
176                 if(!fling)//沒有在滑動(dòng)
177                 {
178 //                    Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>動(dòng)作在區(qū)域外面 沒有在滑動(dòng)<<<<<<<<<<<<<<>>>");
179                     return false;
180                 }
181                 else if(MotionEvent.ACTION_UP!=event.getAction())
182                 {//否則如果也不是抬起手勢(shì),則強(qiáng)制模擬抬起
183                     snapToDestination();
184                     fling = false;
185 //                    Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>動(dòng)作在區(qū)域外面 在滑動(dòng) 也不是抬起手勢(shì)<<<<<<<<<<<<<<>>>");
186                     return false;
187                 }
188 //                Log.e(TAG, "on scroll>>>>>>>>>>>>>>>>>動(dòng)作在區(qū)域外面 在滑動(dòng) 是抬起手勢(shì)<<<<<<<<<<<<<<>>>");
189             }
190            
191             gestureDetector.onTouchEvent(event);
192
193             switch (event.getAction()) {
194             case MotionEvent.ACTION_DOWN:
195                     break;
196             case MotionEvent.ACTION_MOVE:
197                     break;
198             case MotionEvent.ACTION_UP:
199 //                    Log.d(TAG, ">>ACTION_UP:>>>>>>>> MotionEvent.ACTION_UP>>>>>");
200 //                    if (!fling)
201                     {
202                             snapToDestination();
203                     }
204                     fling = false;
205                     break;
206             default:
207                     break;
208             }
209             return true;
210     }
211
212     /**
213      * 切換到指定屏
214      *
215      * @param whichScreen
216      */
217     public void scrollToScreen(int whichScreen) {
218             if (getFocusedChild() != null && whichScreen != currentScreenIndex
219                             && getFocusedChild() == getChildAt(currentScreenIndex)) {
220                     getFocusedChild().clearFocus();
221             }
222             int delta = 0;
223            
224             if(whichScreen==0)
225                 delta= - getScrollX();
226             else if(whichScreen==1)
227                 delta= getWidth()-menuWidth- getScrollX();
228             else if(whichScreen==2)
229                 delta= 2*(getWidth()-menuWidth)- getScrollX();
230             else
231                 return;
232 //                delta = whichScreen * getWidth() - getScrollX();
233            
234             scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
235             invalidate();
236
237             currentScreenIndex = whichScreen;
238     }
239
240     /**
241      * 根據(jù)當(dāng)前x坐標(biāo)位置確定切換到第幾屏
242      */
243     private void snapToDestination() {
244        
245         if(getScrollX()<(getWidth()-menuWidth)/2)
246             scrollToScreen(0);
247         else if(getScrollX()<(getWidth()-menuWidth+getWidth()/2))
248             scrollToScreen(1);
249         else
250             scrollToScreen(2);
251     }
252
253     public interface OnScrollSideChangedListener
254     {
255         public void onScrollSideChanged(View v,boolean leftSide);
256     }
257 }

接下來(lái),在定義activity里面的布局my_layout.xml:

1 <?xml version="1.0" encoding="utf-8"?>
2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3     xmlns:app="http://schemas.android.com/apk/res/grimbo.android.demo.slidingmenu"
4     android:id="@+id/FrameLayout1"
5     android:layout_width="match_parent"
6     android:layout_height="match_parent" >
7     <LinearLayout
8         android:layout_width="match_parent"
9         android:layout_height="match_parent"
10         android:id="@+id/left_menu"
11         android:background="#333"
12         android:orientation="vertical" >
13
14         <Button
15             android:layout_width="200dp"
16             android:layout_height="wrap_content"
17             android:text="左菜單一" />
18         <Button
19             android:layout_width="200dp"
20             android:layout_height="wrap_content"
21             android:text="左菜單二" />
22     </LinearLayout>
23
24     <LinearLayout
25         android:id="@+id/right_menu"
26         android:layout_width="match_parent"
27         android:layout_height="match_parent"
28         android:background="#666"
29         android:orientation="horizontal" >
30         <LinearLayout
31             android:layout_width="wrap_content"
32             android:layout_height="wrap_content"
33             android:layout_weight="1"
34             android:orientation="vertical" >
35         </LinearLayout>
36         <LinearLayout
37             android:layout_width="200dp"
38             android:layout_height="wrap_content"
39             android:orientation="vertical" >
40             <Button
41                 android:layout_width="match_parent"
42                 android:layout_height="wrap_content"
43                 android:text="右菜單一" />
44             <Button
45                 android:layout_width="match_parent"
46                 android:layout_height="wrap_content"
47                 android:text="右菜單二" />
48            
49         </LinearLayout>
50        
51     </LinearLayout>
52     <grimbo.android.demo.slidingmenu.ScrollLayout
53         android:layout_width="match_parent"
54         android:orientation="vertical"
55         android:id="@+id/my_scrollLayout"
56         android:layout_height="match_parent">
57         <LinearLayout
58             android:layout_width="match_parent"
59             android:layout_height="match_parent"
60             android:background="#aaa"
61             android:orientation="vertical" >
62
63
64             <Button
65                 android:id="@+id/button1"
66                 android:layout_width="match_parent"
67                 android:layout_height="wrap_content"
68                 android:text="Button Button" />
69
70             <Spinner
71                 android:id="@+id/spinner1"
72                 android:layout_width="match_parent"
73                 android:layout_height="wrap_content" />
74
75             <SeekBar
76                 android:id="@+id/seekBar1"
77                 android:layout_width="match_parent"
78                 android:layout_height="wrap_content" />
79            
80         </LinearLayout>
81
82     </grimbo.android.demo.slidingmenu.ScrollLayout>
83    
84 </FrameLayout>

最后,在activity里面的onCreate函數(shù)里加上:

 1 setContentView(R.layout.my_layout);
 2         
 3         final LinearLayout left=(LinearLayout)findViewById(R.id.left_menu);
 4         final LinearLayout right=(LinearLayout)findViewById(R.id.right_menu);
 5         right.setVisibility(View.GONE);
 6         left.setVisibility(View.VISIBLE);
 7         
 8         ScrollLayout mScrollLayout=(ScrollLayout)findViewById(R.id.my_scrollLayout);
 9         mScrollLayout.setScrollSideChangedListener(new OnScrollSideChangedListener() {
10             @Override
11             public void onScrollSideChanged(View v, boolean leftSide) {
12                 if(leftSide)
13                 {
14                     right.setVisibility(View.GONE);
15                     left.setVisibility(View.VISIBLE);
16                 }else
17                 {
18                     right.setVisibility(View.VISIBLE);
19                     left.setVisibility(View.GONE);
20                 }
21             }
22         });

大功告成!左右滑動(dòng)是彈性效果也一并實(shí)現(xiàn)~

    app制作
    (8)app制作
    一款好的不僅需要有創(chuàng)意的開發(fā)人員還要有一款合適的制作軟件,有時(shí)候一款好用的制作軟件可以讓開發(fā)人員節(jié)省很多不必要的時(shí)間。另外對(duì)于一些不懂編程的人員來(lái)說(shuō)制作一款也不是沒有可能的,有些功能強(qiáng)大的制作軟件可以讓完全不懂編程的人也能制作出一些精美的來(lái),比如一些公司的產(chǎn)品展示這類不需要有自己特色的就可以通過(guò)制作軟件輕松做出來(lái)。這里西西給大家收整理了一些好用的制作軟件下載,希望對(duì)大家有所幫助。...更多>>
    • appBookv1.0 官方版

      07-04 / 132.6M

      推薦理由:appBook 一次編輯多平臺(tái)發(fā)布 輕松擁有自己的app,appBook是全球首家運(yùn)行在PC和Mac的移動(dòng)平臺(tái)應(yīng)用編輯制作軟
    • 安卓平臺(tái)反編譯神器(Apktool)v6.0.

      02-19 / 13.0M

      推薦理由:Apktool,一款安卓移動(dòng)平臺(tái)上的反編譯利器!Apktool現(xiàn)已完美兼容Android5.0L,使用它可以修改軟件應(yīng)用名稱,
    • myeclipse 10.0

      11-03 / 886M

      推薦理由:MyEclipse 10使用最高級(jí)的桌面和Web開發(fā)技術(shù),包括 HTML5 和 Java EE 6,支持 JPA 2.0、JSF 2.0 、Eclipsel
    • 移動(dòng)應(yīng)用開發(fā)工具(AppCan IDE)V3.1

      11-14 / 421.8M

      推薦理由:AppCan應(yīng)用使用HTML5、CSS3和JavaScript語(yǔ)言編寫,通過(guò)AppCan IDE提供的本地打包工具或在線編譯系統(tǒng)生成可在
    • appMaker中文版v1.0 官方免費(fèi)版

      03-06 / 315.8M

      推薦理由:appMaker中文版是一款免費(fèi)的app制作軟件,可以制作各種展示類的app。如:移動(dòng)互動(dòng)電子書、電子雜志、地產(chǎn)樓
    • 安卓開發(fā)(Google Android SDK)r24.

      05-15 / 85.8M

      推薦理由:Google Android SDKAndroid是Google自己研發(fā)的手機(jī)平臺(tái)操作系統(tǒng),該平臺(tái)基于開源軟件Linux,由操作系統(tǒng)、中
    eclipse
    (119)eclipse
    是對(duì)的擴(kuò)展,利用它我們可以在數(shù)據(jù)庫(kù)和的開發(fā)發(fā)布以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的集成開發(fā)環(huán)境,包括了完備的編碼調(diào)試測(cè)試和發(fā)布功能,完整支持,,,,,,,。分類在結(jié)構(gòu)上,的特征可以被分為類模型開發(fā)工具開發(fā)工具應(yīng)用程序服務(wù)器的連接器項(xiàng)目部署服務(wù)數(shù)據(jù)庫(kù)服務(wù)整合幫助...更多>>
    • android sdk 64位22.3 官方最新版

      11-07 / 480.4M

      推薦理由:完整的android開發(fā)工具,基于Android 4.4的android sdk 22.3 官方最新版,各版本都是相互匹配的,不會(huì)出現(xiàn)安
    • Eclipse 4.3.X 漢化包官方版

      11-14 / 4.3M

      推薦理由:Eclipse4.3漢化包是Eclipse4.3.x的一個(gè)中文漢化包,有了中文語(yǔ)言環(huán)境,搞起開發(fā)來(lái)也順手。 Eclipse4.3漢化
    • ADT Plugin for Eclipse(Android開

      02-24 / 13.8M

      推薦理由:這是一個(gè)Eclipse插件,作用是關(guān)聯(lián)Android SDK,使你的Eclipse能夠新建Android工程,安裝方法如下:打開Ecli
    • Tomcat Eclipse集成插件

      03-15 / 333KB

      推薦理由:Tomcat Eclipse集成插件,在Eclipse里控制Tomcat啟動(dòng)、停止。你懂的 使用方法:放入 eclipse 的 plugins 目
    • Eclipse C語(yǔ)言開發(fā)工具(Eclipse ID

      04-10 / 85.6M

      推薦理由:一個(gè)C / C + +的IDE與Mylyn集成開發(fā)。Feature Listorg.eclipse.cdt 7.0.0org.eclipse.cdt.debug.ui.memory
    • Eclipse 3.6.2 漢化包官方簡(jiǎn)體中文

      04-10 / 3.8M

      推薦理由:漢化包安裝有兩種方法:第一種最簡(jiǎn)單,直接拷貝將對(duì)應(yīng)目錄下的文件拷貝到和Eclipse對(duì)應(yīng)目錄下即可。(將解壓
    eclipse中文版下載
    (27)eclipse中文版下載
    是一個(gè)開放源代碼的基于的可擴(kuò)展開發(fā)平臺(tái)。還包括插件開發(fā)環(huán)境,,這個(gè)組件主要針對(duì)希望擴(kuò)展的軟件開發(fā)人員,因?yàn)樗试S他們構(gòu)建與環(huán)境無(wú)縫集成的工具。它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括開發(fā)工具,。漢化方法把語(yǔ)言包中的,文件夾直接覆蓋到安裝目錄中,或者把漢化包放到目錄下面。常用快捷鍵.快速修復(fù).刪除當(dāng)前行.復(fù)制當(dāng)前行到下一行.或者說(shuō)是空格由于后者與輸入法...更多>>
    JAVA軟件
    (60)JAVA軟件
    軟件下載,編程軟件下載專題有多款適合編程愛好者學(xué)習(xí)使用的軟件,我們提供了適用于開發(fā)者使用的相關(guān)軟件的各個(gè)版本跟新的下載地址,以方便各位愛好者使用學(xué)習(xí)。如果您有什么好的編程軟件可以向我們提供分享下載,如果下載的軟件有什么問題也可以向我們提供建議,祝程序員們學(xué)習(xí)愉快軟件開發(fā)其實(shí)可以不用其他軟件的。只需要安裝了工具包即可,這個(gè)是必須的。并且一定要配置好系統(tǒng)的環(huán)境變量。這個(gè)可以到網(wǎng)上去查,網(wǎng)上很多。然后進(jìn)...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)