Android TV TextView如何實現增加滾動條

這兩天在進行TV端應用商店的版本迭代,其中應用詳情界面有這樣一個需求,“應用介紹在焦點落在其上時,字數超過3行,需要有滾動條,並可上下滾動查看內容,當滾動滑到底,再按下鍵,焦點可離開應用介紹;如果向上滾動,當滾動到頂部,再按上鍵,焦點也可離開應用介紹”。當看到這個需求時,立即想到要給應用介紹所在的TextView增加一個滾動條,並且可以獲取到焦點,這樣纔可以上下滾動。
思路有了,於是開始擼代碼。

首先第一步,

要讓應用介紹所在的TextView獲取到焦點,這個很容易,只需要增加如下兩個屬性即可實現,
android:focusable="true"
android:focusableInTouchMode="true"
這裏簡單介紹一下這兩個屬性,android:focusable="true"表示此控件是否能夠獲取到焦點,android:focusableInTouchMode="true"表示是否可以通過touch或方向鍵來獲得焦點,在手機開發上一般不會設置,因爲大多手機都是觸摸式的,觸摸後會直接響應按鍵事件了。而盒子或TV上在移動方向鍵時需要控件先獲取焦點,然後再點擊確認鍵才能響應按鍵消息。

第二步,

設置最大行數,增加滾動條響應。
在xml佈局文件中增加如下兩行,
android:maxLines="3"
android:scrollbars="vertical"
其中android:maxLines="3"表示最多顯示3行數據,android:scrollbars="vertical"滾動條設置爲縱向。同時,需要需修改代碼,
TextView textView = (TextView)findViewById(R.id.tv_appDesc); textView.setMovementMethod(ScrollingMovementMethod.getInstance()); 
此方法的作用是給TextView增加一個滾動的方法對象,可以直接調用ScrollingMovementMethod的靜態方法getInstance()生成此對象。
第三步,設置焦點選中後的效果。
意思就是在焦點落在此控件時,增加一個選中效果,這裏根據效果圖,自己自定義了一個selector,代碼如下所示,
textview_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" >
        <shape
            android:shape="rectangle" >
            <stroke
                android:width="2px"
                android:color="#ffffff" />
            <corners android:radius="4px"/>
        </shape>
    </item>
</selector>
焦點選中時是一個白色的矩形框,矩形角的弧度爲4px,未選中什麼也不顯示。
然後在佈局中將其設置成背景。
android:background="@drawable/textview_selector"
至此,需求的雛形已經實現。
但有些細節還需要繼續調試,比如,默認的滾動條太暗或者隨着應用主題而改變,我們想保持不變,那可以設置滾動條的圖片。滾動條由兩部分可以設置,滾動圖片和滾動軌道。
分別對應這兩個屬性,
android:scrollbarThumbVertical和android:scrollbarTrackVertical
我用到了android:scrollbarThumbVertical屬性,重新指定了一個滾動圖片,圖片是UI提供的一個.9圖。如下所示:
android:scrollbarThumbVertical="@drawable/scrollbar"
滾動條設置完畢後,發現滾動條和文字貼的很近,於是進行了一下優化。
滾動條有這樣一個屬性android:scrollbarStyle,它可以設置4種值,4種可選值有insideOverlay、insideInset、outsideOverlay、outsideInset四種。
四種值分別表示:
insideOverlay:默認值,表示在padding區域內並且覆蓋在view上,如下所示,

insideInset:表示在padding區域內並且插入在view後面,如下所示,

outsideOverlay:表示在padding區域外並且覆蓋在view上,如下所示,

outsideInset:表示在padding區域外並且插入在view後面,如下所示,

再對比四種效果後,我最終選擇了outsideInset方式。xml中進行如下設置,
android:paddingRight="20px"
android:scrollbarStyle="outsideInset"
最後,設置完成後,需求基本實現,但是,發現在從應用介紹上面的控件按向下,或者下面的控件在按向上鍵時,有時TextView並不能獲取到焦點,於是增加了如下代碼,
android:nextFocusDown="@+id/recycler_view"
android:nextFocusUp="@id/re_progressbar"
這裏的nextFocusDown和nextFocusUp表示當焦點離開這個控件時,並且按的是向下鍵時就跳轉到recycler_view控件,向上時跳轉到re_progressbar控件。
並給re_progressbar按鈕指定向下的控件,
android:nextFocusDown="@+id/tv_appDesc"
給recycler_view列表指定向上的控件,
android:nextFocusUp="@id/tv_appDesc"
這樣上下移動焦點後,邏輯才能正常。
在做完如上設置後,實現的效果如下所示,

怎麼樣,還可以吧。

歡迎您掃一掃上面的微信公衆號,訂閱我的個人公衆號!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章