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

基于Android實現(xiàn)自動滾動布局

 更新時間:2023年12月07日 08:37:25   作者:流浪漢kylin  
在平時的開發(fā)中,有時會碰到這樣的場景,設計上布局的內容會比較緊湊,導致部分機型上某些布局中的內容顯示不完全,或者在數(shù)據(jù)內容多的情況下,單行無法顯示所有內容,這里給大家簡單介紹下布局自動滾動的一種實現(xiàn)方式,感興趣的朋友可以參考下

前言

在平時的開發(fā)中,有時會碰到這樣的場景,設計上布局的內容會比較緊湊,導致部分機型上某些布局中的內容顯示不完全,或者在數(shù)據(jù)內容多的情況下,單行無法顯示所有內容。這時如果要進行處理,無非就那幾種方式:換行、折疊、縮小、截取內容、布局自動滾動等。而這里可以簡單介紹下布局自動滾動的一種實現(xiàn)方式。

1. 布局自動滾動的思路

要實現(xiàn)滾動的效果,在Android中無非兩種,吸附式的滾動或者順滑式的滾動,吸附式就是類似viewpager換頁的效果,如果需求上是要實現(xiàn)這樣的效果,可以使用viewpager進行實現(xiàn),這個類型比較簡單,這里就不過多介紹。另一種是順滑的,非常絲滑的緩慢移動的那種,要實現(xiàn)這種效果,可以使用RecyclerView或者ScrollView來實現(xiàn)。我這里主要使用ScrollView會簡單點。

滑動的控件找到了,那要如何實現(xiàn)絲滑的自動滾動呢?我們都知道ScrollView能用scrollTo和scrollBy去讓它滾動到某個位置,但如何去實現(xiàn)絲滑的效果?

這里就用到了屬性動畫

所以我這邊會使用ScrollView和屬性動畫來實現(xiàn)這個效果

2. 最終效果

可以寫個Demo來看看最終的效果

這就是一個橫向自動滾動的效果。

3. 代碼實現(xiàn)

先寫個接口定義自動滾動的行為

interface Autoscroll {

    // 開始自動滾動
    fun autoStart()
    
    // 停止自動滾動
    fun autoStop()

}

然后自定義一個View繼承ScrollView,方便閱讀,在代碼中加了注釋

// 自定義View繼承HorizontalScrollView,我這里演示橫向滾動的,縱向可以使用ScrollView
class HorizontalAutoscrollLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : HorizontalScrollView(context, attrs, defStyleAttr), Autoscroll {

    // 一些流程上的變量,可以自己去定義,變量多的情況也可以使用builder模式
    var isLoop = true        // 滾動到底后,是否循環(huán)滾動
    var loopDelay = 1000L    // 滾動的時間
    var duration = 1000L     // 每一次滾動的間隔時間

    private var offset: Int = 0
    val loopHandler = Handler(Looper.getMainLooper())
    var isAutoStart = false

    private var animator: ValueAnimator? = null

    override fun autoStart() {
        // 需要計算滾動距離所以要把計算得代碼寫在post里面,等繪制完才拿得到寬度
        post {
            var childView = getChildAt(0)
            childView?.let {
                offset = it.measuredWidth - width
            }

            // 判斷能否滑動,這里只判斷了一個方向,如果想做兩個方向的話,多加一個變量就行
            if (canScrollHorizontally(1)) {
                animator = ValueAnimator.ofInt(0, offset)
                    .setDuration(duration)
                // 屬性動畫去緩慢改變scrollview的滾動位置,抽象上也可以說改變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) {
                        // 動畫結束后判斷是否要重復播放
                        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
            }

        }
    }

    // 動畫取消
    override fun autoStop() {
        animator?.cancel()
        isAutoStart = false
        loopHandler.removeCallbacksAndMessages(null)
    }

}

能看到實現(xiàn)這個功能,寫的代碼不會很多。其中主要需要注意一些點:
(1)屬性動畫要熟,我這里只是簡單的效果,但如果你對屬性動畫能熟練使用的話,你還可以做到加速、減速等效果
(2)頁面關閉的時候要調用autoStop去關閉動畫
(3)這里是用scrollTo去實現(xiàn)滾動的效果,scrollBy也可以,但是寫法就不是這樣了

從代碼可以看出沒什么難點,都是比較基礎的知識,比較重要的知識就是屬性動畫,熟練的話做這種效果的上限就很高。其他的像這里為什么用post,為什么用scrollTo,這些就是比較基礎的知識,就不擴展講了。

最后看看使用的地方,先是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>

然后在開始播放自動滾動(注意頁面關閉的時候要手動停止)

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. 總結

代碼比較簡單,而且都加上了注釋,所以沒有其他要說明的。
前段時間太忙,所以這幾個月都沒時間寫文章。想了一下,這個還是要堅持,如果有時間的話抽出點時間一天寫一點,得保持一個常更新的狀態(tài)。

以上就是基于Android實現(xiàn)自動滾動布局的詳細內容,更多關于Android自動滾動的資料請關注腳本之家其它相關文章!

相關文章

  • Flutter進階之實現(xiàn)動畫效果(一)

    Flutter進階之實現(xiàn)動畫效果(一)

    這篇文章主要為大家詳細介紹了Flutter實現(xiàn)動畫效果的第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android開發(fā)Jetpack組件Lifecycle原理篇

    Android開發(fā)Jetpack組件Lifecycle原理篇

    這一篇文章來介紹Android?Jetpack架構組件的Lifecycle;?Lifecycle用于幫助開發(fā)者管理Activity和Fragment?的生命周期,?由于Lifecycle是LiveData和ViewModel的基礎;所以需要先學習它
    2022-08-08
  • android 自定義控件 自定義屬性詳細介紹

    android 自定義控件 自定義屬性詳細介紹

    在android相關應用開發(fā)過程中,固定的一些屬性可能滿足不了開發(fā)的需求,所以在一些特殊情況下,需要自定義控件與屬性,本文將以此問題進行詳細介紹,需要的朋友可以參考下
    2012-11-11
  • 從源碼分析Android的Glide庫的圖片加載流程及特點

    從源碼分析Android的Glide庫的圖片加載流程及特點

    這篇文章主要介紹了從源碼分析Android的Glide庫的圖片加載流程及特點,Glide庫是Android下一款人氣很高的多媒體資源管理庫,特別是在處理gif加載方面受到眾多開發(fā)者青睞,需要的朋友可以參考下
    2016-04-04
  • 記錄Android studio JNI開發(fā)的三種方式(推薦)

    記錄Android studio JNI開發(fā)的三種方式(推薦)

    JNI (Java Native Interface)是一套編程接口,用來實現(xiàn)Java代碼和其他語言(c、C++或匯編)進行交互。下面通過本文給大家講解Android studio JNI開發(fā)的三種方式,需要的朋友參考下吧
    2017-12-12
  • Android編程獲取控件寬和高的方法總結分析

    Android編程獲取控件寬和高的方法總結分析

    這篇文章主要介紹了Android編程獲取控件寬和高的方法,結合實例形式對比總結并分析了Android控件屬性的相關操作技巧,需要的朋友可以參考下
    2016-01-01
  • android第三方分享方式的簡單實現(xiàn)

    android第三方分享方式的簡單實現(xiàn)

    這篇文章主要為大家詳細介紹了android第三方分享方式的簡單實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • ViewPager+RadioGroup實現(xiàn)左右滑動卡片布局

    ViewPager+RadioGroup實現(xiàn)左右滑動卡片布局

    這篇文章主要為大家詳細介紹了ViewPager+RadioGroup實現(xiàn)左右滑動卡片布局,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android Button 自帶陰影效果另一種解決辦法

    Android Button 自帶陰影效果另一種解決辦法

    這篇文章主要介紹了Android Button 自帶陰影效果另一種解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Android RecyclerView的焦點記憶封裝

    Android RecyclerView的焦點記憶封裝

    這篇文章主要介紹了Android RecyclerView的焦點記憶封裝,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

都兰县| 和硕县| 丰镇市| 阳春市| 临海市| 突泉县| 资中县| 蕉岭县| 兰溪市| 汉沽区| 龙海市| 荃湾区| 荣成市| 贺州市| 焉耆| 景宁| 祁东县| 西畴县| 土默特左旗| 栾川县| 吴川市| 望城县| 南阳市| 盘锦市| 霍邱县| 济阳县| 孟津县| 根河市| 景东| 英超| 轮台县| 远安县| 上饶县| 康平县| 调兵山市| 澄城县| 本溪| 工布江达县| 东丰县| 石屏县| 文成县|