android 自訂ViewGroup和對view進行切圖動畫實現滑動菜單SlidingMenu

來源:互聯網
上載者:User

    就不展示了,和上一節的一樣,滑動菜單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 .




     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.