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

Android Scroller的使用方法

 更新時間:2021年05月19日 08:38:34   作者:吹白  
這篇文章主要為大家詳細介紹了Android Scroller的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android Scroller的使用方法,供大家參考,具體內容如下

1、scrollTo和ScrollBy

View類定義了兩個用于滾動View內容的方法:scrollTo和scrollBy:

/**
 * Set the scrolled position of your view. This will cause a call to
 * {@link #onScrollChanged(int, int, int, int)} and the view will be
 * invalidated.
 * @param x the x position to scroll to
 * @param y the y position to scroll to
 */
public void scrollTo(int x, int y) {
    if (mScrollX != x || mScrollY != y) {
        int oldX = mScrollX;
        int oldY = mScrollY;
        mScrollX = x;
        mScrollY = y;
        invalidateParentCaches();
        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
        if (!awakenScrollBars()) {
            postInvalidateOnAnimation();
        }
    }
}

/**
 * Move the scrolled position of your view. This will cause a call to
 * {@link #onScrollChanged(int, int, int, int)} and the view will be
 * invalidated.
 * @param x the amount of pixels to scroll by horizontally
 * @param y the amount of pixels to scroll by vertically
 */
public void scrollBy(int x, int y) {
    scrollTo(mScrollX + x, mScrollY + y);
}

可以看到scrollBy傳入的x和y參數實際上是X方向和Y方向的滾動距離的增量,最終還是調用了scrollTo方法。而scrollTo方法中做了一些刷新和通知操作,最重要的是對mScrollX和mScrollY進行了賦值。

在View的draw方法中,我們可以看到如下代碼:

int sx = 0;
int sy = 0;
if (!drawingWithRenderNode) {
    computeScroll();
    sx = mScrollX;
    sy = mScrollY;
}

...

if (offsetForScroll) {
    canvas.translate(mLeft - sx, mTop - sy);
}

也就是說,mScrollX和mScrollY最終是用在了內容繪制的地方,其mLeft和mTop本身都沒有因為scrollTo發(fā)生變化。scrollTo作用在View的內容上,而不是View本身。

2、 computeScroll

在上面的View的draw方法的節(jié)選中我們看到在對mScrollX和mScrollY取值之前,調用了computeScroll方法。computeScroll方法聲明如下:

/**
 * Called by a parent to request that a child update its values for mScrollX
 * and mScrollY if necessary. This will typically be done if the child is
 * animating a scroll using a {@link android.widget.Scroller Scroller}
 * object.
 */
public void computeScroll() {
}

根據注釋,computeScroll的典型用法是與Scroller結合使用實現內容/字節(jié)點的滾動動畫。

3、Scroller的使用

Scroller事實上并不直接操作View的滾動,而是根據設置來計算當前X和Y方向的距離。Scroller的一般使用步驟:

1、初始化Scroller,可以指定插值器,不指定則使用默認的ViscousFluidInterpolator
2、調用Scroller#startScroll方法,開始在一段時間內不斷計算X和Y方向的滾動
3、通知View刷新
4、在View#computeScroll中通過scrollTo實現真正的滾動操作
5、通知View刷新

其中在滾動執(zhí)行完成之前4和5會不斷地循環(huán),直至scroller.computeScrollOffset()返回false。

class ScrollableLinearLayout @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
    private val scroller = Scroller(context, BounceInterpolator())

    override fun computeScroll() {
        if(scroller.computeScrollOffset()) {
            // 真正實現滾動操作的地方
            scrollTo(scroller.currX, scroller.currY)

            // 刷新
            invalidate()
        }
    }

    fun scroll() {
        // 調用Scroller的startScroll
        if(scrollX == 0) {
            scroller.startScroll(scrollX, scrollY, /*dx*/ -500, /*dy*/ 0, /*duration*/ 300)
        } else {
            scroller.startScroll(scrollX, scrollY, 500, 0, 300)
        }

        // 刷新
        invalidate()
    }

}

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".scroller.activity.ScrollerSampleActivity">

    <com.sahooz.customviewdemo.scroller.view.ScrollableLinearLayout
        android:id="@+id/sll"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:background="#FFAAAA">

        <Button
            android:id="@+id/btnScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Scroll" />

    </com.sahooz.customviewdemo.scroller.view.ScrollableLinearLayout>

</LinearLayout>

Activity

class ScrollerSampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_scroller_sample)

        val btnScroll = findViewById<Button>(R.id.btnScroll)
        btnScroll.setOnClickListener {
            findViewById<ScrollableLinearLayout>(R.id.sll).scroll()
        }
    }
}

運行結果:

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

相關文章

  • Android實現歌曲播放時歌詞同步顯示具體思路

    Android實現歌曲播放時歌詞同步顯示具體思路

    歌曲播放時歌詞同步顯示,我們需要讀取以上歌詞文件的每一行轉換成成一個個歌詞實體,可根據當前播放器的播放進度與每句歌詞的開始時間,得到當前屏幕中央高亮顯示的那句歌詞
    2013-06-06
  • Android RecyclerView添加搜索過濾器的示例代碼

    Android RecyclerView添加搜索過濾器的示例代碼

    本篇文章主要介紹了Android RecyclerView添加搜索過濾器的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • RxJava 2.x新特性總結整理

    RxJava 2.x新特性總結整理

    這篇文章主要介紹了RxJava 2.x新特性的相關資料,文中通過圖文及示例代碼介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Android開發(fā)判斷一個app應用是否在運行的方法詳解

    Android開發(fā)判斷一個app應用是否在運行的方法詳解

    這篇文章主要介紹了Android開發(fā)判斷一個app應用是否在運行的方法,結合實例形式較為詳細的分析了Android判斷應用運行狀態(tài)的相關操作技巧與注意事項,需要的朋友可以參考下
    2017-11-11
  • Android實現動態(tài)圓環(huán)的圖片頭像控件

    Android實現動態(tài)圓環(huán)的圖片頭像控件

    這篇文章主要為大家詳細介紹了Android實現帶有動態(tài)圓環(huán)的圓形圖片控件DynamicAvatarView的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android設置全屏代碼分享

    Android設置全屏代碼分享

    本文是安卓代碼分享的第一篇,給大家分享了一段簡單的設置安卓全屏的代碼,后續(xù)還會為大家分享一些。
    2014-10-10
  • Android學習筆記之藍牙功能

    Android學習筆記之藍牙功能

    這篇文章主要為大家詳細介紹了Android學習筆記之藍牙功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android Studio格式化(Format)代碼快捷鍵介紹

    Android Studio格式化(Format)代碼快捷鍵介紹

    這篇文章主要介紹了Android Studio格式化(Format)代碼快捷鍵,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Android 日常開發(fā)總結的60條技術經驗

    Android 日常開發(fā)總結的60條技術經驗

    這篇文章主要介紹了Android日常開發(fā)總結的技術經驗60條,需要的朋友可以參考下
    2016-03-03
  • Android中使用DownloadManager類來管理數據下載的教程

    Android中使用DownloadManager類來管理數據下載的教程

    這篇文章主要介紹了Android中使用DownloadManager類來管理數據下載的教程,針對HTTP下文件的下載與保存地址指定等基礎操作作出了詳細講解,需要的朋友可以參考下
    2016-04-04

最新評論

靖江市| 南川市| 尤溪县| 望谟县| 晋宁县| 祁连县| 台中市| 专栏| 弥勒县| 合川市| 黄浦区| 五大连池市| 永嘉县| 杭锦旗| 米脂县| 新田县| 深州市| 安化县| 大城县| 新丰县| 手游| 瓮安县| 德惠市| 龙门县| 松江区| 蓬溪县| 文化| 汤阴县| 甘洛县| 高邑县| 钦州市| 游戏| 上高县| 西畴县| 循化| 肥西县| 云林县| 厦门市| 新津县| 屏东市| 喀喇|