真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄-創(chuàng)新互聯(lián)

這篇文章主要介紹“Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄”文章能幫助大家解決問題。

站在用戶的角度思考問題,與客戶深入溝通,找到蘭坪網(wǎng)站設(shè)計與蘭坪網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋蘭坪地區(qū)。

看下效果:

Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄

首先這個控件是滑動的肯定就會用到scrollTo()或者scrollBy(),和Scroller類。那么先簡單介紹一點這三個東西。

scrollTo(int, int)與scrollBy(int, int)

  1. scrollTo是讓View的content滾動到相對View初始位置的(x, y)處。

  2. scrollBy是讓View的content滾動到相對于View當前位置的(x, y)處。

Scroller類

Scroller是手指滑動中比較重要的一個輔助類,它可以幫助開發(fā)者完成一個順滑的滾動。其主要包括:

  1. startScroll(int startX, int startY, int dx, int dy)startScroll(int startX, int - startY, int dx, int dy, int duration)。

  2. startX,x方向從哪里開始移動。

  3. startY,y方向從哪里開始移動。

  4. dx,x方向移動多遠。

  5. dy,y方向移動多遠。

  6. duration,這個移動操作需要多少時間執(zhí)行完,默認是250毫秒。

如果真正的想使用這個類,還需要配合computeScroll()方法。重寫此方法

@Override
public void computeScroll() {
  if (mScroller.computeScrollOffset()) { // 計算新位置,并判斷上一個滾動是否完成。
     scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
     invalidate();// 再次調(diào)用computeScroll。
  }
}

computeScrollOffset()


這個方法用來計算當前你想知道的一個新位置,Scroller會自動根據(jù)標記時的坐標、時間、當前位置計算出一個新位置,記錄到內(nèi)部,我們可以通過Scroller#getCurrX()和Scroller#getCurrY()獲取的新的位置。


要知道的是,它計算出的新位置是一個閉區(qū)間[x, y],而且會在你調(diào)用startScroll傳入的時間內(nèi)漸漸從你指定的int startX和int startY移動int dx和int dy的距離,所以我們每次調(diào)用Scroller#computeScrollOffset()后再調(diào)用View的scrollTo(int, int)然后傳入Scroller#getCurrX()和Scroller#getCurrY()就可以得到一個漸漸移動的效果。


同時這個方法有一個返回值是boolean類型的,內(nèi)部是用一個boolean來記錄是否完成的,在調(diào)用Scroller#startScroll)時會把這個boolean參數(shù)置為false。內(nèi)部邏輯是先判斷startScroll()動畫是否還在繼續(xù),如果沒有完成則計算新位置,計算新位置前會對duration做判斷,第一如果時間沒到,則真正的計算位置,并且返回true,第二如果時間到了,把記錄是否繼續(xù)的boolean成員變量標記完成,并直接賦值新位置為最終目的位置,并且返回true;如果startScroll()已經(jīng)完成則直接返回false。我們判斷Scroller#computeScrollOffset()是true時說明還沒完成,此時拿到Scroller#getCurrX()和Scroller#getCurrY()做一個滾動。

Scroller#getCurrX()

Scroller#getCurrY()


這兩個方法就是拿到通過Scroller#computeScrollOffset()計算出的新的位置,上面也解釋過了。

Scroller.isFinished()上次的動畫是否完成。

Scroller.abortAnimation()取消上次的動畫。

好了,了解了這些下面開始實現(xiàn)這個效果。


首先先搞一個布局,包括底部導(dǎo)航欄的頭和導(dǎo)航欄的內(nèi)容體。



    

    

    

    
  

配上效果圖。

Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄

很簡單的一個效果(這里只看效果,不看UI啦),藍色的就是內(nèi)容,紅色的就是頭部。
那么我想實現(xiàn)一個什么效果呢,就是開始的時候是看不到藍色部分的,點擊或者滑動紅色部分可以顯示藍色部分,一個上拉和下拉的效果。那么現(xiàn)在肯定要實現(xiàn)一個自定的viewGroup去實現(xiàn)這個布局。


首先我去建一個類BottomBar.class, 為了簡單我直接用它去繼承LinearLayout。重寫它的onLayout()方法。因為我要去把藍色部分隱去,只留紅色部分。怎么做呢 ,代碼如下:

 @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    bottomBar.layout(0, getMeasuredHeight() - bottomBar.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());
    bottomContent.layout(0, getMeasuredHeight(), getMeasuredWidth(), bottomBar.getBottom() + bottomContent.getMeasuredHeight());
  }

通過onLayout()方法改變其位置讓其吧藍色部分隱藏。


接下來就是處理滑動事件了。我要按住紅色部分上下滑動去顯示和隱藏藍色部分,那么肯定是要有手勢識別,重寫onTouchEvent(),再配合view的scrollTo()方法就可以實現(xiàn)這個簡單的效果。

@Override
  public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    switch (event.getAction()){
      case MotionEvent.ACTION_DOWN:
        Log.i("", "--------->x="+event.getX() + ", y="+event.getY());
        downX = (int) event.getX();
        downY = (int) event.getY();
        break;
      case MotionEvent.ACTION_MOVE:
        int endY = (int) event.getY();
        int dy = (int) (endY - downY);
        int toScroll = getScrollY() - dy;
        if(toScroll < 0){
          toScroll = 0;
        } else if(toScroll > bottomContent.getMeasuredHeight()){
          toScroll = bottomContent.getMeasuredHeight();
        }
        scrollTo(0, toScroll);
        downY = (int) event.getY();
        break;
      case MotionEvent.ACTION_UP:
        scrollOffset = getScrollY();
        if(scrollOffset > bottomContent.getMeasuredHeight() / 2){
          showNavigation();
        } else {
          closeNavigation();
        }
        break;
    }

    return true;
  }

代碼就懶了沒有注釋,但是我會在下面解釋一下,都是一些簡單的邏輯,首先ACTION_DOWN里面的代碼,只是記錄了按下的坐標,沒什么的。然后是ACTION_MOVE的代碼。首先應(yīng)該了解getScrollY(),它是控件滑動的距離,初始值為0。可以看到我調(diào)用scrollTo(0, toScroll),而toScroll = getScrolly() - dy;,dy是手指滑動的一個偏移量。通過了這些計算你會發(fā)現(xiàn)toScroll就是藍色部分的高度。那么效果就已經(jīng)實現(xiàn)了,很簡單吧??戳酥竽銈儠粫羞@樣一個疑問哈,也是我當時的一個疑問,那就是為什么我們不直接用dy也就是手指滑動的一個距離來當作toScroll 的值呢(不考慮下面對downY的賦值,單純是手指滑動的距離)。其實是可以的,控件會隨著手指滑動的。但是,當手指離開屏幕再次點擊的時候,菜單又會回到原來的狀態(tài)再進行滑動。那么為什么會造成這樣的效果呢,仔細看過你會發(fā)現(xiàn),每次點擊的時候dy都是0,所以每次調(diào)用scrollTo(x, y)的時候x, y都是0,自然菜單就會回到初始位置。所以getScrollY() - dy其實就是再記錄上一次的位置,使在下一次點擊的時候'y'的值不是0。前提是需要每次對downY重新進行賦值。好了有了這些上拉下拉的效果就有了。但是只有這樣還是不行,我們要做到它自動的彈出和收回。接下來就是ACTION_UP時做處理,我調(diào)用了showNavigation();和colseNavigation();,代碼如下都是簡單的邏輯不做解釋。

  private void showNavigation(){
    int dy = bottomContent.getMeasuredHeight() - scrollOffset;
    mScroller.startScroll(getScrollX(), getScrollY(), 0, dy, 500);
    invalidate();
  }

  private void closeNavigation(){
    int dy = 0 - scrollOffset;
    mScroller.startScroll(getScrollX(), getScrollY(), 0, dy, 500);
    invalidate();
  }

關(guān)于“Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。


分享題目:Android怎么使用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://weahome.cn/article/dpjdgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部