欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android仿iOS實(shí)現(xiàn)側(cè)滑返回功能(類似微信)

 更新時間:2017年12月02日 14:21:43   作者:陳銘卓  
這篇文章主要為大家詳細(xì)介紹了Android仿iOS實(shí)現(xiàn)側(cè)滑返回功能,類似微信功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

我們都知道側(cè)滑返回操作是 iOS 里面比較常見的功能,一般是手指在靠近手機(jī)屏幕左邊緣向右滑動就可以關(guān)閉當(dāng)前的界面,iOS 系統(tǒng)提供了這樣的 API,但是 Android 怎么實(shí)現(xiàn)呢?網(wǎng)上找了許多方法,比較了一下,個人覺得還是這個比較方便也容易理解,

先上個效果再說:

原理

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

設(shè)置 Activity 透明
滑動 View

實(shí)現(xiàn)

1、設(shè)置透明:

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

<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:windowIsTranslucent">true</item>
</style>

然后在 AndroidManifest.xml 文件里面給相應(yīng)的 Activity 設(shè)置透明的主題。比如 MainActivity :

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

2、滑動View:

先看看 Activity 的層次結(jié)構(gòu):我們用的 Activity 的 xml 的根 View 并不是 Activity 的根 View ,在它上面還有一個父 View, id 是 android.R.id.content,再向上一層,還有一個view,它是一個 LinearLayout,它除了放置我們創(chuàng)建的 View 之外,還放置我們的 xml 之外的一些東西比如放 ActionBar 或者標(biāo)題欄什么的。而再往上一級,就到了 Activity 的根 View —— DecorView,結(jié)構(gòu)

如下圖所示:

要做到像 iOS 那樣可以滑動整個 Activity ,只滑動我們在xml里面創(chuàng)建的 View 顯然是不對的,因?yàn)槲覀冞€有標(biāo)題欄、ActionBar 什么的,所以我們要滑動的應(yīng)該是 DecorView 或者倒數(shù)第二層的那個 View。

而要滑動 View的話,我們要重寫其父窗口的 onInterceptTouchEvent 以及 onTouchEvent(當(dāng)然使用 setOnTouchListener 不是不可能,但是如果子 View 里面有一個消費(fèi)了 onTouch 事件,那么也就接收不到了),但是窗口的創(chuàng)建過程不是我們能控制的,DecorView 的創(chuàng)建都不是我們能干預(yù)的。

解決辦法就是,我們自己創(chuàng)建一個 SwipeLayout,然后人為地插入頂層 View 中,放置在 DecorView 和其下面的 LinearLayout 中間,隨著手指的滑動,不斷改變 SwipeLayout 的子 View ——曾經(jīng)是 DecorView 的子 View——的位置,這樣我們就可以控制 Activity 的滑動啦。我們在 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 下面的第一個 View,并保存到 content
  content = root.getChildAt(0);
  ViewGroup.LayoutParams params = content.getLayoutParams();
  ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(-1, -1);
  //把根 View 下面原來的第一個 View 刪除
  root.removeView(content);
  //把 content 添加到 SwipeLayout
  this.addView(content, params2);
  //再把 SwipeLayout 添加到根 View 里面
  root.addView(this, params);
  sideWidth = (int) (sideWidthInDP * activity.getResources().getDisplayMetrics().density);
}


然后把這些寫成一個 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);
  }
  ...
}

總結(jié)

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

其實(shí)另外還暴露出來一個方法:
public void setSwipeAnyWhere(boolean swipeAnyWhere) 設(shè)置是否屏幕任意位置右滑關(guān)閉,因?yàn)槟J(rèn)是只能左邊緣右滑返回。

最后

附上原github: https://github.com/NashLegend/SwipetoFinishActivity

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn))

    Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn))

    這篇文章主要介紹了Android仿微信菜單(Menu)(使用C#和Java分別實(shí)現(xiàn)),本文分別給出C#和Java版的運(yùn)行效果及實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Android編程實(shí)現(xiàn)向SD卡寫入數(shù)據(jù)的方法

    Android編程實(shí)現(xiàn)向SD卡寫入數(shù)據(jù)的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)向SD卡寫入數(shù)據(jù)的方法,涉及Android針對SD卡狀態(tài)判斷,文件及權(quán)限操作等相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • Android通過記住密碼功能學(xué)習(xí)數(shù)據(jù)存儲類SharedPreferences詳解及實(shí)例

    Android通過記住密碼功能學(xué)習(xí)數(shù)據(jù)存儲類SharedPreferences詳解及實(shí)例

    這篇文章主要通過“記住密碼”實(shí)例功能學(xué)習(xí)為大家介紹了Android數(shù)據(jù)存儲類SharedPreferences,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • android實(shí)現(xiàn)短按電源鍵關(guān)機(jī)的實(shí)現(xiàn)代碼

    android實(shí)現(xiàn)短按電源鍵關(guān)機(jī)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了android實(shí)現(xiàn)短按電源鍵關(guān)機(jī)的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Kotlin匿名函數(shù)使用介紹

    Kotlin匿名函數(shù)使用介紹

    定義時不取名字的函數(shù),我們稱之為匿名函數(shù),匿名函數(shù)通常整體傳遞給其他函數(shù)或者從其他函數(shù)返回,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Eclipse新建Android項(xiàng)目報(bào)錯解決方案詳細(xì)匯總

    Eclipse新建Android項(xiàng)目報(bào)錯解決方案詳細(xì)匯總

    這篇文章主要介紹了Eclipse新建Android項(xiàng)目報(bào)錯解決方案詳細(xì)匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Android在高jar包版本的工程中修改方法

    Android在高jar包版本的工程中修改方法

    android的應(yīng)用程序安裝包APK如果是在高版本的android jar上開發(fā)的是無法在低版本的android SDK上跑的,那么如何簡單的在高版本的工程中直接修改呢,需要的朋友可以了解下
    2012-12-12
  • 淺談Android硬件加速原理與實(shí)現(xiàn)簡介

    淺談Android硬件加速原理與實(shí)現(xiàn)簡介

    這篇文章主要介紹了淺談Android硬件加速原理與實(shí)現(xiàn)簡介,本文嘗試從底層硬件原理,一直到上層代碼實(shí)現(xiàn),對硬件加速技術(shù)進(jìn)行簡單介紹,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android實(shí)現(xiàn)圓角Button按鈕

    Android實(shí)現(xiàn)圓角Button按鈕

    這篇文章主要介紹了Android實(shí)現(xiàn)圓角Button按鈕,利用xml文件中 shape實(shí)現(xiàn)圓角效果,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Flutter進(jìn)階之實(shí)現(xiàn)動畫效果(九)

    Flutter進(jìn)階之實(shí)現(xiàn)動畫效果(九)

    這篇文章主要為大家詳細(xì)介紹了Flutter進(jìn)階之實(shí)現(xiàn)動畫效果的第九篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論