基于Android實(shí)現(xiàn)自動(dòng)滾動(dòng)布局
前言
在平時(shí)的開(kāi)發(fā)中,有時(shí)會(huì)碰到這樣的場(chǎng)景,設(shè)計(jì)上布局的內(nèi)容會(huì)比較緊湊,導(dǎo)致部分機(jī)型上某些布局中的內(nèi)容顯示不完全,或者在數(shù)據(jù)內(nèi)容多的情況下,單行無(wú)法顯示所有內(nèi)容。這時(shí)如果要進(jìn)行處理,無(wú)非就那幾種方式:換行、折疊、縮小、截取內(nèi)容、布局自動(dòng)滾動(dòng)等。而這里可以簡(jiǎn)單介紹下布局自動(dòng)滾動(dòng)的一種實(shí)現(xiàn)方式。
1. 布局自動(dòng)滾動(dòng)的思路
要實(shí)現(xiàn)滾動(dòng)的效果,在Android中無(wú)非兩種,吸附式的滾動(dòng)或者順滑式的滾動(dòng),吸附式就是類(lèi)似viewpager換頁(yè)的效果,如果需求上是要實(shí)現(xiàn)這樣的效果,可以使用viewpager進(jìn)行實(shí)現(xiàn),這個(gè)類(lèi)型比較簡(jiǎn)單,這里就不過(guò)多介紹。另一種是順滑的,非常絲滑的緩慢移動(dòng)的那種,要實(shí)現(xiàn)這種效果,可以使用RecyclerView或者ScrollView來(lái)實(shí)現(xiàn)。我這里主要使用ScrollView會(huì)簡(jiǎn)單點(diǎn)。
滑動(dòng)的控件找到了,那要如何實(shí)現(xiàn)絲滑的自動(dòng)滾動(dòng)呢?我們都知道ScrollView能用scrollTo和scrollBy去讓它滾動(dòng)到某個(gè)位置,但如何去實(shí)現(xiàn)絲滑的效果?
這里就用到了屬性動(dòng)畫(huà)
所以我這邊會(huì)使用ScrollView和屬性動(dòng)畫(huà)來(lái)實(shí)現(xiàn)這個(gè)效果
2. 最終效果
可以寫(xiě)個(gè)Demo來(lái)看看最終的效果
這就是一個(gè)橫向自動(dòng)滾動(dòng)的效果。
3. 代碼實(shí)現(xiàn)
先寫(xiě)個(gè)接口定義自動(dòng)滾動(dòng)的行為
interface Autoscroll { // 開(kāi)始自動(dòng)滾動(dòng) fun autoStart() // 停止自動(dòng)滾動(dòng) fun autoStop() }
然后自定義一個(gè)View繼承ScrollView,方便閱讀,在代碼中加了注釋
// 自定義View繼承HorizontalScrollView,我這里演示橫向滾動(dòng)的,縱向可以使用ScrollView class HorizontalAutoscrollLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : HorizontalScrollView(context, attrs, defStyleAttr), Autoscroll { // 一些流程上的變量,可以自己去定義,變量多的情況也可以使用builder模式 var isLoop = true // 滾動(dòng)到底后,是否循環(huán)滾動(dòng) var loopDelay = 1000L // 滾動(dòng)的時(shí)間 var duration = 1000L // 每一次滾動(dòng)的間隔時(shí)間 private var offset: Int = 0 val loopHandler = Handler(Looper.getMainLooper()) var isAutoStart = false private var animator: ValueAnimator? = null override fun autoStart() { // 需要計(jì)算滾動(dòng)距離所以要把計(jì)算得代碼寫(xiě)在post里面,等繪制完才拿得到寬度 post { var childView = getChildAt(0) childView?.let { offset = it.measuredWidth - width } // 判斷能否滑動(dòng),這里只判斷了一個(gè)方向,如果想做兩個(gè)方向的話(huà),多加一個(gè)變量就行 if (canScrollHorizontally(1)) { animator = ValueAnimator.ofInt(0, offset) .setDuration(duration) // 屬性動(dòng)畫(huà)去緩慢改變scrollview的滾動(dòng)位置,抽象上也可以說(shuō)改變scrollview的屬性 animator?.addUpdateListener { val currentValue = it.animatedValue as Int scrollTo(currentValue, 0) } animator?.addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) { } override fun onAnimationEnd(animation: Animator) { // 動(dòng)畫(huà)結(jié)束后判斷是否要重復(fù)播放 if (isLoop) { loopHandler?.postDelayed({ if (isAutoStart) { scrollTo(0, 0) autoStart() } }, loopDelay) } } override fun onAnimationCancel(animation: Animator) { } override fun onAnimationRepeat(animation: Animator) { } }) animator?.start() isAutoStart = true } } } // 動(dòng)畫(huà)取消 override fun autoStop() { animator?.cancel() isAutoStart = false loopHandler.removeCallbacksAndMessages(null) } }
能看到實(shí)現(xiàn)這個(gè)功能,寫(xiě)的代碼不會(huì)很多。其中主要需要注意一些點(diǎn):
(1)屬性動(dòng)畫(huà)要熟,我這里只是簡(jiǎn)單的效果,但如果你對(duì)屬性動(dòng)畫(huà)能熟練使用的話(huà),你還可以做到加速、減速等效果
(2)頁(yè)面關(guān)閉的時(shí)候要調(diào)用autoStop去關(guān)閉動(dòng)畫(huà)
(3)這里是用scrollTo去實(shí)現(xiàn)滾動(dòng)的效果,scrollBy也可以,但是寫(xiě)法就不是這樣了
從代碼可以看出沒(méi)什么難點(diǎn),都是比較基礎(chǔ)的知識(shí),比較重要的知識(shí)就是屬性動(dòng)畫(huà),熟練的話(huà)做這種效果的上限就很高。其他的像這里為什么用post,為什么用scrollTo,這些就是比較基礎(chǔ)的知識(shí),就不擴(kuò)展講了。
最后看看使用的地方,先是Demo的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.kylin.testproject.HorizontalAutoscrollLayout android:id="@+id/auto_scroll" android:layout_width="150dp" android:layout_height="wrap_content"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="小日本" /> <ImageView android:layout_width="36dp" android:layout_height="36dp" android:scaleType="fitXY" android:src="@drawable/a" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="排放核廢水污染海洋" /> <ImageView android:layout_width="36dp" android:layout_height="36dp" android:scaleType="fitXY" android:src="@drawable/b" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text=",必遭天譴!!" /> </LinearLayout> </com.kylin.testproject.HorizontalAutoscrollLayout> </LinearLayout>
然后在開(kāi)始播放自動(dòng)滾動(dòng)(注意頁(yè)面關(guān)閉的時(shí)候要手動(dòng)停止)
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val autoScroll: HorizontalAutoscrollLayout = findViewById(R.id.auto_scroll) autoScroll.duration = 3000 autoScroll.loopDelay = 2000 autoScroll.autoStart() }
4. 總結(jié)
代碼比較簡(jiǎn)單,而且都加上了注釋?zhuān)詻](méi)有其他要說(shuō)明的。
前段時(shí)間太忙,所以這幾個(gè)月都沒(méi)時(shí)間寫(xiě)文章。想了一下,這個(gè)還是要堅(jiān)持,如果有時(shí)間的話(huà)抽出點(diǎn)時(shí)間一天寫(xiě)一點(diǎn),得保持一個(gè)常更新的狀態(tài)。
以上就是基于Android實(shí)現(xiàn)自動(dòng)滾動(dòng)布局的詳細(xì)內(nèi)容,更多關(guān)于Android自動(dòng)滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- android實(shí)現(xiàn)歌詞自動(dòng)滾動(dòng)效果
- Android使用自定義屬性實(shí)現(xiàn)圖片自動(dòng)播放滾動(dòng)的功能
- Android ViewPager無(wú)限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
- Android使用Recyclerview實(shí)現(xiàn)圖片水平自動(dòng)循環(huán)滾動(dòng)效果
- android scrollview 自動(dòng)滾動(dòng)到頂部或者底部的實(shí)例
- Android編程實(shí)現(xiàn)TextView垂直自動(dòng)滾動(dòng)功能【附demo源碼下載】
相關(guān)文章
淺談AnDroidDraw+DroidDraw實(shí)現(xiàn)Android程序UI設(shè)計(jì)的分析說(shuō)明
本篇文章是對(duì)AnDroidDraw+DroidDraw實(shí)現(xiàn)Android程序UI設(shè)計(jì)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果
在項(xiàng)目中遇到需要提供給用戶(hù)一個(gè)密碼輸入框明文/密文切換顯示的需求,今天小編借腳本之家平臺(tái)給大家分享下Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果,需要的朋友參考下2017-01-01android中實(shí)現(xiàn)手機(jī)號(hào)碼的校驗(yàn)的示例代碼
本篇文章主要介紹了android中實(shí)現(xiàn)手機(jī)號(hào)碼的校驗(yàn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Android多線(xiàn)程斷點(diǎn)續(xù)傳下載實(shí)現(xiàn)代碼
這篇文章主要介紹了Android多線(xiàn)程斷點(diǎn)續(xù)傳下載實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11學(xué)習(xí)Android開(kāi)發(fā)之RecyclerView使用初探
Android開(kāi)發(fā)學(xué)習(xí)之路的第一課RecyclerView使用初探,感興趣的小伙伴們可以參考一下2016-07-07