就不展示了,和上一節的一樣,滑動菜單SlidingMenu效果如何大家都比較熟悉,在這裡我簡單說明一下用自訂ViewGroup來實現.
實現方法:我們自訂一個ViewGroup實現左右滑動,第一屏隱藏,第二屏顯示.
代碼如下:
package com.jj.sliding_6;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.view.View.MeasureSpec;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.widget.AbsoluteLayout;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.Scroller;/*** * 自訂view * * @author zhangjia * */public class MyViewGroup extends ViewGroup {private Scroller scroller;// 滑動private int distance;// 滑動距離private View menu_view, content_view;private int duration = 500;private ViewTreeObserver viewTreeObserver;private Context context;private CloseAnimation closeAnimation;public static boolean isMenuOpned = false;// 菜單是否開啟public MyViewGroup(Context context) {super(context, null);}public void setCloseAnimation(CloseAnimation closeAnimation) {this.closeAnimation = closeAnimation;}public MyViewGroup(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;scroller = new Scroller(context);}public void setDistance(int distance) {this.distance = distance;}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {if (changed) {menu_view = getChildAt(0);// 擷取滑動菜單的viewcontent_view = getChildAt(1);// 獲得首頁view// 相當於fill_parentcontent_view.measure(0, 0);content_view.layout(0, 0, getWidth(), getHeight());}}@Overridepublic void computeScroll() {Log.e("jj", "isMenuOpned=" + isMenuOpned);if (scroller.computeScrollOffset()) {scrollTo(scroller.getCurrX(), scroller.getCurrY());postInvalidate();// 重新整理if (closeAnimation != null)closeAnimation.closeMenuAnimation();}else{MainActivity.isScrolling=false;}}void showMenu() {Log.e("jj", "shoeMenu");isMenuOpned = true;scroller.startScroll(getScrollX(), 0, -distance, 0, duration);invalidate();// 重新整理}// 關閉菜單(執行自訂動畫)void closeMenu() {Log.e("jj", "closeMenu");isMenuOpned = false;scroller.startScroll(getScrollX(), 0, distance, 0, duration);invalidate();// 重新整理}// 關閉菜單(執行自訂動畫)void closeMenu_1() {isMenuOpned = false;scroller.startScroll(getScrollX(), 0, distance - getWidth(), 0,duration);invalidate();// 重新整理}// 關閉菜單(執行自訂動畫)void closeMenu_2() {isMenuOpned = false;scroller.startScroll(getScrollX(), 0, getWidth(), 0, duration);invalidate();// 重新整理}/*** * Menu startScroll(startX, startY, dx, dy) * * dx=e1的減去e2的x,所以右移為負,左移動為正 dx為移動的距離,如果為正,則標識向左移動|dx|,如果為負,則標識向右移動|dx| */void slidingMenu() {Log.e("jj", "slidingMenu");// 沒有超過半屏if (getScrollX() > -getWidth() / 2) {scroller.startScroll(getScrollX(), 0, -getScrollX(), 0, duration);isMenuOpned = false;}// 超過半屏else if (getScrollX() <= -getWidth() / 2) {scroller.startScroll(getScrollX(), 0, -(distance + getScrollX()),0, duration);isMenuOpned = true;}invalidate();// 重新整理Log.v("jj", "getScrollX()=" + getScrollX());}} abstract class CloseAnimation {// 點擊list item 關閉menu動畫public void closeMenuAnimation() {};}
上訴大部分我都加以注釋,想必不用我解釋太多,大家仔細看都應該可以看懂.
之後我們只需要在MainActivity中把要顯示的view添加進去就可以了。
運行效果:
我把源碼上傳網上,大家可以下載運行,如有不足請留言.
說明一點:listview上下左右滑動衝突沒有解決,不過我運行看過很多應用,要麼listview不能左右滑動,要麼能左右滑動但是listview不到一屏.
源碼下載
下面我介紹另外一種方法,這種方法比較簡單,但是有點不實用.不過對SlidingMenu滑動菜單要求不高的應用完全可以了,如:雲中書城等,沒有用到手勢時時滑動.
實現方法:我們在點擊或者滑動的時候擷取當前view的切圖bitmap,然後將這個bitmap傳遞到開啟後的activity,在這個activity中布局具體如下:
<?xml version="1.0" encoding="utf-8"?><AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="fill_parent" > <FrameLayout android:id="@+id/slideout_placeholder" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#777777" > <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#00000000" /> </FrameLayout> <ImageView android:id="@+id/slidedout_cover" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" /></AbsoluteLayout>
這種布局目的就是讓使用者覺得我們操作的是一個view.
具體實現:我將代碼上傳網上,大家自行下載運行,有不足之處,自行調整.
;
源碼下載
這篇講解比較少,不過大部分都加以注釋,相信大家都看得明白.
我看了有的朋友是對HorizontalScrollView進行的自訂,實現方法比較多,因人而異,總之只要實現效果就行.
寫到這裡,不足的地方請之處,thanks for you .