最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

完美解決EditText和ScrollView的滾動沖突(下)

 更新時間:2016年06月20日 10:31:52   作者:曾博文  
這篇文章再次為大家詳細介紹了完美解決EditText和ScrollView滾動沖突的方法,感興趣的小伙伴們可以參考一下

上篇文章完美解決EditText和ScrollView的滾動沖突(上)中提到咱們自己寫了一個判斷EditText是否可以在垂直方向上滾動的方法,那么這個方法是如何得來的呢?
其實Android API里是有一個判斷控件是否可以在垂直方向上滾動的方法的,方法名字叫做canScrollVertically(int direction),代碼如下:

/**
   * Check if this view can be scrolled vertically in a certain direction.
   *
   * @param direction Negative to check scrolling up, positive to check scrolling down.
   * @return true if this view can be scrolled in the specified direction, false otherwise.
   */
  public boolean canScrollVertically(int direction) {
    final int offset = computeVerticalScrollOffset();
    final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
    if (range == 0) return false;
    if (direction < 0) {
      return offset > 0;
    } else {
      return offset < range - 1;
    }
  }

根據(jù)注釋不難得知此方法是用來判斷當前控件是否可以在垂直的方向上進行滾動的:當參數(shù)direction傳的是負值的時候,會判斷當前控件是否可以向上滾動;否則當參數(shù)direction傳的是非負值的時候,會判斷當前控件是否可以向下滾動。
由此得知我們完全可以利用此方法這樣來判斷一個控件是否可以在垂直方向上進行滾動:

if(editText.canScrollVertically(-1) || editText.canScrollVertically(0)) {
      //垂直方向上可以滾動
    }

那么為什么不使用此方法呢?很無奈,因為這個方法是在API 14(也就是Android4.0)才提供的方法,而很多時候我們需要兼容4.0以下的手機,所以并不能直接使用。雖然不能直接使用此方法,不過我們可以看一下它內(nèi)部是怎么實現(xiàn)的,直接抄過來不就得了!不過還有個悲劇的消息,computeVerticalScrollOffset()、computeVerticalScrollRange()和computeVerticalScrollExtent()這三個方法都是protected方法,所以我們?nèi)匀徊荒苁褂?,沒辦法,我們只好一塊兒將這三個方法內(nèi)部的實現(xiàn)都看一下。

1.computeVerticalScrollOffset()方法

首先是computeVerticalScrollOffset()方法:`

protected int computeVerticalScrollOffset() {
    return mScrollY;
  }

此方法定義在View中,并且EditText和TextView都沒有重寫,所以其返回的必然是mScrollY。那么不適用這個方法我們該如何得到mScrollY呢?稍微猜測一下,既然有mScrollY這么一個變量,那么就應(yīng)該有其的get方法。查看API,不難發(fā)現(xiàn)View中確實有個getScrollY()方法:

public final int getScrollY() {
    return mScrollY;
  }

2. computeVerticalScrollRange()方法

OK,第一個方法的值我們通過getScrollY()拿到了,接下來咱們來看第二個方法computeVerticalScrollRange():

protected int computeVerticalScrollRange() {
    return getHeight();
  }

在View中很快找到了此方法,但此方法使我們需要的嗎?不要忘了我們使用的是EditText!所以我們需要查看一下在EditText和TextView中是否對此方法進行了重載。不出我們所料,這個方法還真在TextView中進行了重載:

@Override
  protected int computeVerticalScrollRange() {
    if (mLayout != null)
      return mLayout.getHeight();

    return super.computeVerticalScrollRange();
  }

這個方法返回的是mLayout的高度,那么我們怎么獲得mLayout呢?剛剛咱們獲得mScrollY時使用了getScrollY()方法,那么是不是會有一個getLayout()方法呢?抱著試試看的態(tài)度,忽然間發(fā)現(xiàn)在TextView中還真有這么一個方法:

public final Layout getLayout() {
    return mLayout;
  }

3.computeVerticalScrollExtent()方法

恩,第二個方法的值我們也通過getLayout().getHeight()方法拿到了,現(xiàn)在咱們就來看一下最后一個方法computeVerticalScrollExtent():

protected int computeVerticalScrollExtent() {
    return getHeight();
  }

在View中我們同樣找到了此方法,但根據(jù)第二個方法的經(jīng)驗,我們還應(yīng)該去EditText和TextView中看一下有沒有重載。又一次地不出我們所料,這個方法果然在TextView中進行了重載:

@Override
  protected int computeVerticalScrollExtent() {
    return getHeight() - getCompoundPaddingTop() - getCompoundPaddingBottom();
  }

然后不難發(fā)現(xiàn),此處使用的三個方法getHeight()、getCompoundPaddingTop()和getCompoundPaddingBottom()都是public方法,我們直接調(diào)用即可。
至此,我們已經(jīng)可以完全對canScrollVertically(int direction)這個方法進行重寫了,而重寫之后的方法就是咱們上一篇文章中使用的canVerticalScroll(EditText editText)方法。

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

相關(guān)文章

  • Android開發(fā)技巧之我的菜單我做主(自定義菜單)

    Android開發(fā)技巧之我的菜單我做主(自定義菜單)

    Android SDK本身提供了一種默認創(chuàng)建菜單的機制,雖然功能上還不錯,但是界面的美觀度不是很理想,本結(jié)介紹一種實現(xiàn)方法:就是通過onKeyDown事件方法和PopupWindow實現(xiàn)自定義的菜單,感興趣的朋友可以了解下
    2013-01-01
  • 淺談一下Android的Activity

    淺談一下Android的Activity

    這篇文章主要介紹了淺談一下Android的Activity,活動是所有安卓應(yīng)用程序的門面,凡事你在應(yīng)用中看到的東西,都是放到活動中的,需要的朋友可以參考下
    2023-04-04
  • Kotlin類型安全構(gòu)建器的一次運用記錄

    Kotlin類型安全構(gòu)建器的一次運用記錄

    這篇文章主要給大家介紹了關(guān)于Kotlin類型安全構(gòu)建器的一次運用,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Kotlin具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • Android中系統(tǒng)自帶鎖WalkLock與KeyguardLock用法實例詳解

    Android中系統(tǒng)自帶鎖WalkLock與KeyguardLock用法實例詳解

    這篇文章主要介紹了Android中系統(tǒng)自帶鎖WalkLock與KeyguardLock用法,結(jié)合實例形式較為詳細的分析了WalkLock與KeyguardLock的功能、作用、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-01-01
  • Android studio 下的APK打包失敗問題解決辦法

    Android studio 下的APK打包失敗問題解決辦法

    這篇文章主要介紹了Android studio 下的APK打包失敗問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android實現(xiàn)帶描邊的圓角圖片

    Android實現(xiàn)帶描邊的圓角圖片

    這篇文章主要為大家詳細介紹了Android實現(xiàn)帶描邊的圓角圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android使用Room數(shù)據(jù)庫解決本地持久化的操作

    Android使用Room數(shù)據(jù)庫解決本地持久化的操作

    Room 是一個持久性庫,屬于 Android Jetpack 的一部分,Room 是 SQLite 數(shù)據(jù)庫之上的一個抽象層,Room 并不直接使用 SQLite,而是負責簡化數(shù)據(jù)庫設(shè)置和配置以及與數(shù)據(jù)庫交互方面的瑣碎工作,本文介紹了Android使用Room數(shù)據(jù)庫解決本地持久化的操作,需要的朋友可以參考下
    2024-09-09
  • Android 自定義View的構(gòu)造函數(shù)詳細介紹

    Android 自定義View的構(gòu)造函數(shù)詳細介紹

    這篇文章主要介紹了Android 自定義View的構(gòu)造函數(shù)詳細介紹的相關(guān)資料,這里對構(gòu)造函數(shù)進行了對比按需使用,需要的朋友可以參考下
    2016-12-12
  • Android網(wǎng)格視圖GridView的使用

    Android網(wǎng)格視圖GridView的使用

    網(wǎng)格視圖GridView的排列方式與矩陣類似,當屏幕上有很多元素(文字、圖片或其他元素)需要按矩陣格式進行顯示時,就可以使用GridView控件來實現(xiàn)
    2016-01-01
  • Android Flutter實現(xiàn)仿閑魚動畫效果

    Android Flutter實現(xiàn)仿閑魚動畫效果

    目前正在做的項目,為了增加用戶的體驗度,準備增加一些動畫效果。本文將通過Android Flutter實現(xiàn)仿閑魚動畫效果,感興趣的可以嘗試一下
    2023-02-02

最新評論

涪陵区| 陇南市| 万安县| 油尖旺区| 莱州市| 阿坝县| 龙南县| 福清市| 饶阳县| 内黄县| 田东县| 德昌县| 连云港市| 太仓市| 南宫市| 黄大仙区| 商河县| 关岭| 衢州市| 兰州市| 图们市| 嘉定区| 镇安县| 墨玉县| 鹿泉市| 安图县| 祥云县| 永顺县| 乐安县| 木里| 沅陵县| 商都县| 开阳县| 运城市| 麻栗坡县| 忻城县| 根河市| 永顺县| 若尔盖县| 武胜县| 崇仁县|