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

Android 側(cè)滑關(guān)閉Activity的實(shí)例

 更新時(shí)間:2017年07月28日 09:58:08   作者:我就是馬云飛  
這篇文章主要介紹了Android 側(cè)滑關(guān)閉Activity的實(shí)例的相關(guān)資料,好的手機(jī)現(xiàn)在沒有物理返回鍵,或者說統(tǒng)一Android 與IOS 軟件功能的時(shí)候,需要側(cè)滑關(guān)閉,需要的朋友可以參考下

Android 側(cè)滑關(guān)閉Activity的實(shí)例

實(shí)現(xiàn)原因

其實(shí)側(cè)滑關(guān)閉activity在網(wǎng)上也有大量的文章去介紹他,我也有去看,要么是代碼實(shí)在太多看不下去,要么就是跑了項(xiàng)目沒有反應(yīng)的。唯一的方法還是自己隨手魯一個(gè)~,側(cè)滑這個(gè)東西在Android中是比較少見的,iOS是最常見不過了,因?yàn)楫吘顾麄儧]有物理返回鍵。還有UIScrollView那些。然而我們用的最多的QQ也只是有個(gè)功能,并沒有真正的滑動(dòng)效果。至于微信的,我記得N久以前滑出了一個(gè)bug。也沒什么印象了。估計(jì)也是極小的概率事件。于是,當(dāng)初我就強(qiáng)行的魯了一個(gè)。下面我們一步步分析實(shí)現(xiàn)的思路以及代碼。

百行代碼解決側(cè)滑關(guān)閉

首先來看下我們一些簡單的定義:

private Activity activity;
  private Scroller scroller;
  //上次ACTION_MOVE時(shí)的X坐標(biāo)
  private int last_X;
  //屏幕寬度
  private int width;
  //可滑動(dòng)的最小X坐標(biāo),小于該坐標(biāo)的滑動(dòng)不處理
  private int min_X;
  // 頁面邊緣的陰影圖
  private Drawable left_shodow;
  //頁面邊緣陰影的寬度默認(rèn)值
  private static final int SHADOW_WIDTH = 16;
  // 頁面邊緣陰影的寬度
  private int shadow_width;
  // Activity finish標(biāo)識(shí)符
  private boolean isFinish;

這邊我已經(jīng)注釋過了,就不做過多就寫了。接下來,我們看下我們的一些初始化已經(jīng)外部調(diào)用方法:

 private void initView(Activity activity) {
    this.activity = activity;
    scroller = new Scroller(activity);
    left_shodow = getResources().getDrawable(R.drawable.left_shadow);
    int density = (int) activity.getResources().getDisplayMetrics().density;
    shadow_width = SHADOW_WIDTH * density;
    // 這里你一定要設(shè)置成透明背景,不然會(huì)影響你看到底層布局
    setBackgroundColor(Color.argb(0, 0, 0, 0));
  }

  public void bindActivity(Activity activity) {
    ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
    View child = decorView.getChildAt(0);
    decorView.removeView(child);
    addView(child);
    decorView.addView(this);

我們主要看下bindactivity這個(gè)方法。這個(gè)是我們用來綁定一個(gè)activity的。這個(gè)activity你們可以基于baseactivity實(shí)現(xiàn)一個(gè)backactivity。為什么要這么做,因?yàn)槟忝總€(gè)activity都要寫這么一句話,我感覺就是浪費(fèi)時(shí)間,一個(gè)基類直接解決。這個(gè)activity我們可以這么寫:

public abstract class SWBackActivity extends Activity {

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SWBackLayout layout = new SWBackLayout(this);
    layout.bindActivity(this);
  }

  protected abstract void afterInject();

  protected abstract void afterInitView();

}

那么接下來我們看下,如果對(duì)手勢(shì)的處理讓他側(cè)滑關(guān)閉呢?

  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        last_X = (int) event.getX();
        width = getWidth();
        min_X = width / 10;
        break;
      case MotionEvent.ACTION_MOVE:
        int rightMovedX = last_X - (int) event.getX();
        if (getScrollX() + rightMovedX >= 0) {// 左側(cè)即將滑出屏幕
          scrollTo(0, 0);
        } else if ((int) event.getX() > min_X) {// 手指處于屏幕邊緣時(shí)不處理滑動(dòng)
          scrollBy(rightMovedX, 0);
        }
        last_X = (int) event.getX();
        break;
      case MotionEvent.ACTION_UP:
        if (-getScrollX() < width / 3) {
          scrollBack();
          isFinish = false;
        } else {
          scrollClose();
          isFinish = true;
        }
        break;
    }
    return true;
  }

  private void scrollBack() {
    int startX = getScrollX();
    int dx = -getScrollX();
    scroller.startScroll(startX, 0, dx, 0, 300);
    invalidate();
  }

  private void scrollClose() {
    int startX = getScrollX();
    int dx = -getScrollX() - width;
    scroller.startScroll(startX, 0, dx, 0, 300);
    invalidate();
  }

  public void computeScroll() {
    if (scroller.computeScrollOffset()) {
      scrollTo(scroller.getCurrX(), 0);
      postInvalidate();
    } else if (isFinish) {
      activity.finish();
    }
    super.computeScroll();
  }

  protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    drawShadow(canvas);
  }

  private void drawShadow(Canvas canvas) {
    // 保存畫布當(dāng)前的狀態(tài)
    canvas.save();
    // 設(shè)置drawable的大小范圍
    left_shodow.setBounds(0, 0, shadow_width, getHeight());
    // 讓畫布平移一定距離
    canvas.translate(-shadow_width, 0);
    // 繪制Drawable
    left_shodow.draw(canvas);
    // 恢復(fù)畫布的狀態(tài)
    canvas.restore();
  }

首先我們?cè)贏CTION_DOWN記錄按下點(diǎn)的X坐標(biāo)

然后在ACTION_MOVE中判斷,如果我們getScrollX() + rightMovedX是否是大于0的,如果大于0,表示Activity處于滑動(dòng)狀態(tài),并且是向左滑動(dòng),同時(shí)我們進(jìn)行了判斷,手指處于屏幕邊緣時(shí)不可以滑動(dòng)。

最后在ACTION_UP中判斷如果手指滑動(dòng)的距離大于布局寬度的1/3,表示將Activity滑出界面,否則滑動(dòng)到起始位置,我們利用Scroller類的startScroll()方法設(shè)置好開始位置,滑動(dòng)距離和時(shí)間,然后調(diào)用postInvalidate()刷新界面,之后就到computeScroll()方法中,我們利用scrollTo()方法對(duì)該布局的父布局進(jìn)行滾動(dòng),滾動(dòng)結(jié)束之后,我們判斷界面是否滑出界面,如果是那就劃出頁面讓activity finish掉。否則,布局就歸位。

使用方法

其實(shí)使用方法很簡單,直接繼承SWBackActivity就可以了。那么我們最后來看下效果圖:

以上就是實(shí)現(xiàn)Android 側(cè)滑關(guān)閉Activity 的實(shí)例,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • android 通過MediaRecorder實(shí)現(xiàn)簡單的錄音示例

    android 通過MediaRecorder實(shí)現(xiàn)簡單的錄音示例

    本篇文章中主要介紹了android 通過MediaRecorder實(shí)現(xiàn)簡單的錄音示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Android VNDK使用及原理深入探究

    Android VNDK使用及原理深入探究

    這篇文章主要為大家介紹了Android VNDK使用及原理深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Flutter StreamBuilder組件實(shí)現(xiàn)局部刷新示例講解

    Flutter StreamBuilder組件實(shí)現(xiàn)局部刷新示例講解

    日常使用最多的局部刷新為Provider狀態(tài)管理 Selector,今天分享flutter框架自帶的StreamBuilder組件,該組件可做到局部刷新,使用簡單且輕便
    2022-11-11
  • android通用xml解析方法

    android通用xml解析方法

    之前做的網(wǎng)絡(luò)相關(guān)的應(yīng)用,里面涉及到了xml的解析,由于急于完成任務(wù)也沒有設(shè)計(jì)就直接敲代碼。這幾天給一個(gè)朋友做項(xiàng)目的時(shí)候也涉及到了xml的解析,而且解析的內(nèi)容比較多,我查看了以前的項(xiàng)目中的相關(guān)代碼,頓時(shí)覺得很多代碼都是可以優(yōu)化的。在此寫兩個(gè)通用的xml解析方法,當(dāng)然這里所講的通用只是在一定程度上并且需要遵守一些規(guī)范。
    2013-03-03
  • android AlertDialog多種使用方法詳解

    android AlertDialog多種使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了android AlertDialog多種使用方法,包括普通對(duì)話框、單選對(duì)話框、多選對(duì)話框等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android自定義輪播圖效果

    Android自定義輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android實(shí)現(xiàn)SwipeRefreshLayout首次進(jìn)入自動(dòng)刷新

    Android實(shí)現(xiàn)SwipeRefreshLayout首次進(jìn)入自動(dòng)刷新

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)SwipeRefreshLayout首次進(jìn)入自動(dòng)刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android開發(fā)中方向傳感器定義與用法詳解【附指南針實(shí)現(xiàn)方法】

    Android開發(fā)中方向傳感器定義與用法詳解【附指南針實(shí)現(xiàn)方法】

    這篇文章主要介紹了Android開發(fā)中方向傳感器定義與用法,結(jié)合實(shí)例形式分析了Android方向傳感器的功能、定義與使用方法,并附帶基于方向傳感器實(shí)現(xiàn)指南針功能的方法,需要的朋友可以參考下
    2017-11-11
  • Android Service中使用Toast無法正常顯示問題的解決方法

    Android Service中使用Toast無法正常顯示問題的解決方法

    這篇文章主要介紹了Android Service中使用Toast無法正常顯示問題的解決方法,分析了Service中Toast無法正常顯示的原因與相關(guān)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • Android鬧鈴服務(wù)AlarmManager用法深入分析

    Android鬧鈴服務(wù)AlarmManager用法深入分析

    這篇文章主要介紹了Android鬧鈴服務(wù)AlarmManager用法,結(jié)合實(shí)例形式深入分析了鬧鈴服務(wù)AlarmManager的功能、原理、定義與使用方法,需要的朋友可以參考下
    2016-08-08

最新評(píng)論