像知乎、iOS那樣滑動Activity

來源:互聯網
上載者:User

標籤:知乎   android   滑動activity   


這裡只介紹原理,更詳細的實現代碼地址在此:https://github.com/NashLegend/SwipetoFinishActivity


這是Activity滑動的

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/4D/41/wKioL1ROVDLBj9MNAAXGth6htgA590.jpg" title="know.png" width="280" height="500" border="0" hspace="0" vspace="0" style="width:280px;height:500px;" alt="wKioL1ROVDLBj9MNAAXGth6htgA590.jpg" />

像fragment一樣,activity本身是沒有滑動的方法的,但是我們可以製造一個正在滑動activity的假象,使得這個activity看起來正在被手指滑動。其原理其實很簡單,我們滑動的其實是activity裡面的可見view元素,同時我們將activity設定為透明的,這樣當activity中可見的view元素滑過的時候,由於activity的底部是透明的,我們就可以在滑動過程中看到下面的activity,這樣看起來就是在滑動activity。所以activity滑動效果分兩步,1,設定activity透明,2,滑動view。

  1. 設定透明: 建立一個Style,在Style裡面添加下面兩行,並將這個style應用在activity上就可以了

    <item name="android:windowBackground">@*android:color/transparent</item><item name="android:windowIsTranslucent">true</item>
  2. 滑動view:先看看activity的階層:如,我們用的activity的xml的根view(在中是倒數第二層的FrameLayout)並不是activity的根view,在它上面還有一個父view,id是android.R.id.content,再向上一層,還有一個view,它是一個LinearLayout,它除了放置我們建立的view之外,還放置我們的xml之外的一些東西比如放ActionBar或者標題列(在是左邊那一分枝)。而再往上一級,就到了activity的根view——DecorView。

     650) this.width=650;" src="https://camo.githubusercontent.com/e7593131dff52ae21d60a0c615c9d1d23cbbc870/687474703a2f2f692e696d6775722e636f6d2f6b4275766e524d2e706e67" style="border:0px;" />

    要做到像iOS那樣,可以滑動整個activity,只滑動我們在xml裡面建立的view顯然是不對的,因為我們還有標題列、ActionBar什麼的,所以我們要滑動的應該是DecorView或者倒數第二層的那個view。

    而要滑動view的話,我們要重寫其父視窗的onInterceptTouchEvent以及onTouchEvent【當然使用setOnTouchListener也可以,但是如果有一個子view消費了onTouch事件,那麼也就接收不到了】,但是視窗的建立過程不是我們能控制的,DecorView的建立都不是我們能干預的。解決辦法就是,我們自己建立一個SwipeLayout,然後人為地插入到頂層view中,放置在DecorView和其下面的LinearLayout中間,隨著手指的滑動,不斷改變SwipeLayout的子view——曾經是DecorView的子view——的位置,這樣我們就可以控制我們的滑動啦。

    我們在自訂的SwipeLayout中添加一個replaceLayer,這個方法執行將SwipeLayout插入頂層的代碼,並在activity的onPostCreate()方法中調用swipeLayout.replaceLaye()替換我們的SwipeLayout,代碼如下:

    public void replaceLayer(Activity activity) {        mActivity = activity;        screenWidth = getScreenWidth(activity);        setClickable(true);        ViewGroup root = (ViewGroup) activity.getWindow().getDecorView();        content = root.getChildAt(0);        ViewGroup.LayoutParams params = content.getLayoutParams();        root.removeView(content);        this.addView(content);        root.addView(this, params);    }

然後我們把這些寫成一個SwipeActivity,其它activity只要繼承這個SwipeActivity並設定上第一步中的style就可以實現滑動返回功能, 這裡只說滑動activity的原理,剩下的都是控制滑動以及關閉Activity什麼的事了,詳見代碼在這裡:  摸我

BTW,滑動Fragment原理其實一樣,只不過更加簡單,省去替換那一步,Fragment在view樹中就是它onCreateView返回的元素,用fragment.getView可以取得,滑動fragment其實滑動的就是fragment.getView。只要把滑動方法寫在它父view中就可以了。

本文出自 “NashLegend” 部落格,請務必保留此出處http://nashlegend.blog.51cto.com/5635342/1568629

像知乎、iOS那樣滑動Activity

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.