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

Android仿iOS側(cè)滑退出當(dāng)前界面功能

 更新時(shí)間:2017年12月02日 14:28:23   作者:彼岸人生  
這篇文章主要為大家詳細(xì)介紹了Android仿iOS側(cè)滑退出當(dāng)前界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

我們都知道在ios手機(jī)上面,有一個(gè)側(cè)滑退出當(dāng)前界面的功能,但是在安卓手機(jī)上系統(tǒng)沒有給我們提供這樣的功能,但是這依然阻擋不了強(qiáng)大的安卓的定制功能,我們完全可以自己定制一套這樣的功能。

首先看下效果圖:

分析:

(1)要想模仿ios的這種效果,因?yàn)槲覀兺ㄟ^手指的滑動,所以這里肯定跟我們的滑動事件有關(guān)系(onInterceptTouchEvent,onTouchEvent這兩個(gè)方法的關(guān)系,如果不清楚,請直接查閱事件傳遞機(jī)制原理)

(2)我們要想直接攔截我們的所有觸摸事件,我們可以在上層父級布局中進(jìn)行攔截和處理,這里我們想到了DecorView。首先我們應(yīng)該知道Activity的頂級父View是DecorView,獲取我們的DecorView也很簡單

getWindow().getDecorView() 

我們平時(shí)寫的那些xml布局文件都是包裹在這個(gè)DecorView中的,所以這里我們就有了一個(gè)思路:
我們可以在我們的xml布局和DecorView中間添加一個(gè)中間布局(SlidingLayout),然后所有的滑動邏輯和滑動沖突全部在這里面處理。

(3)比較關(guān)鍵的是:當(dāng)我們需要使用側(cè)滑動能的Activity我們需要將它的主題設(shè)置成透明,這樣滑動的時(shí)候就不會遮擋下面的Activity,代碼如下:

<style name="AppTheme.Slide" parent="@style/AppTheme"> 
  <!--Required--> 
  <item name="android:windowBackground">@android:color/transparent</item> 
  <item name="android:windowIsTranslucent">true</item> 
  <item name="android:windowAnimationStyle">@style/AppTheme.Slide.Animation</item> 
 </style> 

(4)當(dāng)我們滑動超過半屏的時(shí)候,退出當(dāng)前界面,否則則回退到原始位置。這里使用Scroller

下面直接上代碼進(jìn)行分析:

1)、觸摸事件的處理過程,按下的位置大于X軸的十分之一就攔截當(dāng)前事件,交給SlidingLayout的onTouchEvent處理

/** 
 * 根據(jù)手指移動的距離判斷是否攔截觸摸事件 
 * 
 * @param ev 
 * @return 
 */ 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 
  int x = (int) ev.getX(); 
  int y = (int) ev.getY(); 
  boolean mIntercept = false; 
  switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mInterceptDownX = x; 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastInterceptX; 
    int moveY = y - mLastInterceptY; 
    //按下的位置的X位置小于屏幕的十分之一,并且x移動的距離大于y移動的距離,就攔截 
    if (mInterceptDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) { 
     mIntercept = true; 
    } else { 
     mIntercept = false; 
    } 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
 
    break; 
   case MotionEvent.ACTION_UP: //抬起的時(shí)候重置參數(shù) 
    mIntercept = false; 
    mInterceptDownX = mLastInterceptX = mLastInterceptY = 0; 
    break; 
  } 
  return mIntercept; 
 } 
 
 private int mTouchDownX; 
 private int mLastTouchX; 
 private int mLastTouchY; 
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 
  boolean mConsumed = false; 
  int x = (int) event.getX(); 
  int y = (int) event.getY(); 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mTouchDownX = x; 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastTouchX; 
    int moveY = y - mLastTouchY; 
    if (mTouchDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY) && !mConsumed) { 
     mConsumed = true; 
    } 
    if (mConsumed) { 
     int rightMoveX = (int) (mLastTouchX - event.getX()); 
     if ((getScrollX() + rightMoveX) > 0) { //向左滑動的時(shí)候,getScrollX()和rightMoveX都大于0,所以禁止滑動 
      scrollTo(0, 0); 
     } else { 
      scrollBy(rightMoveX, 0); 
     } 
    } 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_UP: 
 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()<getWidth()/2){ //偏移量不到屏幕寬度的一般,就回到最初的位置 
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
   case MotionEvent.ACTION_CANCEL: 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()<getWidth()/2){ //偏移量不到屏幕寬度的一般,就回到最初的位置 
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
  } 
  return true; 
 } 

2)、滑動的偏移量超出屏幕的一辦,就關(guān)閉當(dāng)前界面否則回到初始位置

/** 
 * 滑動到最初的位置 
 */ 
 private void scrollBack() { 
  int startX = getScrollX(); 
  int dx = -getScrollX(); 
  mScroller.startScroll(startX, 0, dx, 0, 300); 
  invalidate(); 
 } 
 
 /** 
 * 向右滑動關(guān)閉 
 */ 
 private void scrollFinish(){ 
  int dx = -getScrollX() - getWidth(); 
  mScroller.startScroll(getScrollX(),0,dx,0,300); 
  invalidate(); 
 } 

3)、我們可以將這些側(cè)滑處理放在我們的BaseActivity當(dāng)中,需要側(cè)滑的Activity只要繼承這個(gè)BaseActivity并且主題設(shè)置成透明就可以了

@Override 
 protected void onCreate(@Nullable Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  if(enableRightSliding()){ 
 
   SlidingLayout slidingLayout = new SlidingLayout(this); 
   slidingLayout.replaceCurrentLayout(this); 
  } 
 
 } 
 
 /** 
  * 子類重寫這個(gè)方法true:允許向右滑動,false:禁止向右滑動 
  * @return 
  */ 
 protected boolean enableRightSliding(){ 
  return false; 
 } 

源碼下載:仿ios側(cè)滑退出當(dāng)前界面功能

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

相關(guān)文章

  • Android 百分比布局詳解及實(shí)例代碼

    Android 百分比布局詳解及實(shí)例代碼

    這篇文章主要介紹了Android 百分比布局詳解及實(shí)例代碼的相關(guān)資料,這里附有代碼實(shí)例幫助大家學(xué)習(xí)參考,如何實(shí)現(xiàn)百分比布局,需要的朋友可以參考下
    2016-11-11
  • android 添加按(power鍵)電源鍵結(jié)束通話(掛斷電話)

    android 添加按(power鍵)電源鍵結(jié)束通話(掛斷電話)

    首先我們發(fā)現(xiàn)現(xiàn)在我們所用的android智能手機(jī)大部分都有當(dāng)你在打電話時(shí)按power鍵來掛斷電話,一般都是在設(shè)置中
    2013-01-01
  • Kotlin?lambda表達(dá)式入門指南

    Kotlin?lambda表達(dá)式入門指南

    在kotlin當(dāng)中,Lambda表達(dá)式是最高等級的,Lambda表達(dá)式可以理解為一種匿名函數(shù),是一種高效的類似于函數(shù)式編程的表達(dá)式,本文介紹Kotlin?lambda表達(dá)式入門指南,感興趣的朋友一起看看吧
    2024-03-03
  • Android 仿今日頭條簡單的刷新效果實(shí)例代碼

    Android 仿今日頭條簡單的刷新效果實(shí)例代碼

    這篇文章主要介紹了Android 仿今日頭條簡單的刷新效果實(shí)例代碼的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟

    Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟

    這篇文章主要介紹了Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Android 7.0 Nougat不得不知的11項(xiàng)新功能

    Android 7.0 Nougat不得不知的11項(xiàng)新功能

    不得不知的11項(xiàng)Android 7.0 Nougat新功能,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android實(shí)現(xiàn)分享功能

    Android實(shí)現(xiàn)分享功能

    如何在Android中實(shí)現(xiàn)分享功能?這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)分享功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android Activity打開后被應(yīng)用快照遮住的問題

    Android Activity打開后被應(yīng)用快照遮住的問題

    這篇文章主要介紹了Android Activity打開后被應(yīng)用快照遮住的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Android中正確使用字體圖標(biāo)(iconfont)的方法

    Android中正確使用字體圖標(biāo)(iconfont)的方法

    IconFont字體不僅僅流行于Web開發(fā),在移動開發(fā)中也漸漸的使用的范圍更廣泛。這篇文章主要介紹了在Android開發(fā)中使用icon font的代碼和方法。對大家學(xué)習(xí)使用iconfont有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • Android使用AudioManager修改系統(tǒng)音量的方法

    Android使用AudioManager修改系統(tǒng)音量的方法

    這篇文章主要介紹了Android使用AudioManager修改系統(tǒng)音量的方法,結(jié)合實(shí)例形式分析了AudioManager調(diào)節(jié)音量的常用方法及相關(guān)使用技巧,需要的朋友可以參考下
    2016-08-08

最新評論