這篇文章將為大家詳細(xì)講解有關(guān)Android仿iOS如何實(shí)現(xiàn)側(cè)滑返回功能,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),通遼網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:通遼等地區(qū)。通遼做網(wǎng)站價(jià)格咨詢:13518219792先上個(gè)效果再說(shuō):
原理
Activity 本身是不可以滑動(dòng)的,但是我們可以制造一個(gè)正在滑動(dòng) Activity 的假象,使得看起來(lái)這個(gè) Activity 正在被手指滑動(dòng)。其原理其實(shí)很簡(jiǎn)單,我們滑動(dòng)的其實(shí)是 Activity 里面的可見(jiàn)View元素,而我們將 Activity 設(shè)置為透明的,這樣當(dāng) View 滑過(guò)的時(shí)候,由于 Activity 的底部是透明的,我們就可以在滑動(dòng)過(guò)程中看到下面的Activity,這樣看起來(lái)就是在滑動(dòng) Activity。所以 Activity 滑動(dòng)效果分兩步:
設(shè)置 Activity 透明
滑動(dòng) View
實(shí)現(xiàn)
1、設(shè)置透明:
資源文件 values -> styles.xml 添加如下代碼,搞一個(gè)透明的主題。
然后在 AndroidManifest.xml 文件里面給相應(yīng)的 Activity 設(shè)置透明的主題。比如 MainActivity :
2、滑動(dòng)View:
先看看 Activity 的層次結(jié)構(gòu):我們用的 Activity 的 xml 的根 View 并不是 Activity 的根 View ,在它上面還有一個(gè)父 View, id 是 android.R.id.content,再向上一層,還有一個(gè)view,它是一個(gè) LinearLayout,它除了放置我們創(chuàng)建的 View 之外,還放置我們的 xml 之外的一些東西比如放 ActionBar 或者標(biāo)題欄什么的。而再往上一級(jí),就到了 Activity 的根 View —— DecorView,結(jié)構(gòu)
如下圖所示:
要做到像 iOS 那樣可以滑動(dòng)整個(gè) Activity ,只滑動(dòng)我們?cè)趚ml里面創(chuàng)建的 View 顯然是不對(duì)的,因?yàn)槲覀冞€有標(biāo)題欄、ActionBar 什么的,所以我們要滑動(dòng)的應(yīng)該是 DecorView 或者倒數(shù)第二層的那個(gè) View。
而要滑動(dòng) View的話,我們要重寫(xiě)其父窗口的 onInterceptTouchEvent 以及 onTouchEvent(當(dāng)然使用 setOnTouchListener 不是不可能,但是如果子 View 里面有一個(gè)消費(fèi)了 onTouch 事件,那么也就接收不到了),但是窗口的創(chuàng)建過(guò)程不是我們能控制的,DecorView 的創(chuàng)建都不是我們能干預(yù)的。
解決辦法就是,我們自己創(chuàng)建一個(gè) SwipeLayout,然后人為地插入頂層 View 中,放置在 DecorView 和其下面的 LinearLayout 中間,隨著手指的滑動(dòng),不斷改變 SwipeLayout 的子 View ——曾經(jīng)是 DecorView 的子 View——的位置,這樣我們就可以控制 Activity 的滑動(dòng)啦。我們?cè)?Activity 的 onPostCreate 方法中調(diào)用swipeLayout.replaceLayer 替換我們的 SwipeLayout,代碼如下:
public void replaceLayer(Activity activity) { mActivity = activity; screenWidth = getScreenWidth(activity); setClickable(true); //獲取 Activity 的 根 View ViewGroup root = (ViewGroup) activity.getWindow().getDecorView(); //獲取 根 View 下面的第一個(gè) View,并保存到 content content = root.getChildAt(0); ViewGroup.LayoutParams params = content.getLayoutParams(); ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(-1, -1); //把根 View 下面原來(lái)的第一個(gè) View 刪除 root.removeView(content); //把 content 添加到 SwipeLayout this.addView(content, params2); //再把 SwipeLayout 添加到根 View 里面 root.addView(this, params); sideWidth = (int) (sideWidthInDP * activity.getResources().getDisplayMetrics().density); }
然后把這些寫(xiě)成一個(gè) SwipeActivity 要求實(shí)現(xiàn)側(cè)滑返回的 Activity 繼承 SwipeActivity , SwipeActivity 繼承 FragmentActivity 或者 Activity 。比如 MainActivity:
public class SwipeActivity extends FragmentActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } ... }
public class MainActivity extends SwipeActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } ... }Android是什么
Android是一種基于Linux內(nèi)核的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。
關(guān)于“Android仿iOS如何實(shí)現(xiàn)側(cè)滑返回功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。