欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

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

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

看下效果:

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

首先這個(gè)控件是滑動(dòng)的肯定就會(huì)用到scrollTo()或者scrollBy(),和Scroller類。那么先簡(jiǎn)單介紹一點(diǎn)這三個(gè)東西。

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

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

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

Scroller類

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

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

  2. startX,x方向從哪里開(kāi)始移動(dòng)。

  3. startY,y方向從哪里開(kāi)始移動(dòng)。

  4. dx,x方向移動(dòng)多遠(yuǎn)。

  5. dy,y方向移動(dòng)多遠(yuǎn)。

  6. duration,這個(gè)移動(dòng)操作需要多少時(shí)間執(zhí)行完,默認(rèn)是250毫秒。

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

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

computeScrollOffset()


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


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


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

Scroller#getCurrX()

Scroller#getCurrY()


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

Scroller.isFinished()上次的動(dòng)畫(huà)是否完成。

Scroller.abortAnimation()取消上次的動(dòng)畫(huà)。

好了,了解了這些下面開(kāi)始實(shí)現(xiàn)這個(gè)效果。


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

<com.study.androidtest.BottomBar
    android:orientation="vertical"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
      android:background="@color/colorAccent"
      android:layout_width="match_parent"
      android:layout_height="50dp">

    </LinearLayout>

    <LinearLayout
      android:background="@color/colorPrimaryDark"
      android:layout_width="match_parent"
      android:layout_height="200dp">

    </LinearLayout>
  </com.study.androidtest.BottomBar>

配上效果圖。

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

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


首先我去建一個(gè)類BottomBar.class, 為了簡(jiǎn)單我直接用它去繼承LinearLayout。重寫(xiě)它的onLayout()方法。因?yàn)槲乙グ阉{(lán)色部分隱去,只留紅色部分。怎么做呢 ,代碼如下:

 @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());
  }

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


接下來(lái)就是處理滑動(dòng)事件了。我要按住紅色部分上下滑動(dòng)去顯示和隱藏藍(lán)色部分,那么肯定是要有手勢(shì)識(shí)別,重寫(xiě)onTouchEvent(),再配合view的scrollTo()方法就可以實(shí)現(xiàn)這個(gè)簡(jiǎ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;
  }

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

  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實(shí)現(xiàn)一個(gè)可向上滑動(dòng)的底部導(dǎo)航欄”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

分享題目:Android怎么使用Scroller實(shí)現(xiàn)一個(gè)可向上滑動(dòng)的底部導(dǎo)航欄-創(chuàng)新互聯(lián)
URL分享:http://aaarwkj.com/article10/dpjdgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站營(yíng)銷、網(wǎng)站制作定制網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)
亚洲欧美日韩老汉影院| 神马影院在线观看午夜| 尤物欧美精品一区二区三区| 国产日韩欧美一区二区三区四区| 国产亚洲精品视频免费| 乡村丰满的大屁股熟妇| 精品视频美女肉体亚洲| 蜜臀99久久精品久久久| 亚洲精品熟女国产中文| 国产一区二区三区午夜视频| 日韩免费黄色av网站| 尤物在线观看精品视频| 国产亚洲av看码精品永久| 日本色网一区二区三区四区| 国产av人妻精品一区二| 欧美日韩国产激情在线观看| 日韩在线免费色视频| 日韩在线视频这里只有精品| 亚洲av永久精品一区二区三区| 亚洲高清中文字幕专区| 国产一区二区三区日本精品| 日本黄色免费在线观看网站| 操老熟女一区二区三区| 未满十八禁止在线观看av| 国产精品欧美日韩高清| 亚洲免费一区二区三区精品| 免费爱爱视频在线观看| 巨乳人妻一区二区三区| 中文字幕日产乱码一二三区| 国产精品久久一国产精品| 日韩看片一区二区三区高清| 粉嫩极品国产在线观看| 午夜情色视频在线观看| 国产精品久久中文字幕网| 精精国产xxxx视频在线不卡| 蜜桃视频在线观看91| 蜜桃久久国产精品一区二区| 丰满少妇一级淫片在线播放| 日韩一级不卡高清视频| 国产姐弟操大率悠荡笕| 漂亮人妻被中出中文字幕|