1. 程式人生 > >Android模仿iOS實現側滑返回(類似微信)

Android模仿iOS實現側滑返回(類似微信)

actionbar fin kth ins any lean blog 模仿 over

我們都知道側滑返回操作是 iOS 裏面比較常見的功能,一般是手指在靠近手機屏幕左邊緣向右滑動就可以關閉當前的界面,iOS 系統提供了這樣的 API,但是 Android 怎麽實現呢?

網上找了許多方法,比較了一下,個人覺得還是這個比較方便也容易理解,先上個效果再說:

技術分享圖片

原理

Activity 本身是不可以滑動的,但是我們可以制造一個正在滑動 Activity 的假象,使得看起來這個 Activity 正在被手指滑動。其原理其實很簡單,我們滑動的其實是 Activity 裏面的可見View元素,而我們將 Activity 設置為透明的,這樣當 View 滑過的時候,由於 Activity 的底部是透明的,我們就可以在滑動過程中看到下面的Activity,這樣看起來就是在滑動 Activity。所以 Activity 滑動效果分兩步:

  • 設置 Activity 透明
  • 滑動 View

1、設置透明:資源文件 values -> styles.xml 添加如下代碼,搞一個透明的主題

 //透明主題
    <style name="BlankTheme" parent="AppTheme">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

然後在 AndroidManifest.xml 文件裏面給相應的 Activity 設置透明的主題。比如 MainActivity :

<activity
    android:name="com.example.test.MainActivity"
    android:theme="@style/Transparent" >
</activity>

2、滑動View:

先看看 Activity 的層次結構:我們用的 Activity 的 xml 的根 View 並不是 Activity 的根 View ,在它上面還有一個父 View, id 是 android.R.id.content,再向上一層,還有一個view,它是一個 LinearLayout,它除了放置我們創建的 View 之外,還放置我們的 xml 之外的一些東西比如放 ActionBar 或者標題欄什麽的。而再往上一級,就到了 Activity 的根 View —— DecorView,結構如下圖所示:

技術分享圖片

然後把這些寫成一個 SwipeActivity 要求實現側滑返回的 Activity 繼承 SwipeActivity , SwipeActivity 繼承 FragmentActivity 或者 Activity .直接上代碼你可以直接復制過去

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);
    }
    ...
}

總結

其實在工作中,開發一個項目基本都會封裝一個 BaseActivity,只要 BaseActivity 繼承 SwipeActivity ,然後所有繼承 BaseActivity 的 Activity 就都可以實現側滑返回了, 如果有不需要實現這個功能的只需要調用 SwipeActivity 裏面的一個方法: public void setSwipeEnabled(boolean swipeEnabled) 參數傳一個 false 就好了。是不是很方便!

其實另外還暴露出來一個方法: public void setSwipeAnyWhere(boolean swipeAnyWhere) 設置是否屏幕任意位置右滑關閉,因為默認是只能左邊緣右滑返回。

最後

附上原github: https://github.com/NashLegend/SwipetoFinishActivity 你可以去github上下載源代碼直接跑起來測一下。

Android模仿iOS實現側滑返回(類似微信)