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使用Scroller實現彈性滑動效果
- Android用Scroller實現一個可向上滑動的底部導航欄
- Android Scroller大揭秘
- Android Scroller及下拉刷新組件原理解析
- android使用 ScrollerView 實現 可上下滾動的分類欄實例
- Android Scroller完全解析
- 深入理解Android中Scroller的滾動原理
- Android程序開發(fā)之UIScrollerView里有兩個tableView
- 詳解Android應用開發(fā)中Scroller類的屏幕滑動功能運用
- 詳解Android Scroller與computeScroll的調用機制關系
相關文章
Android RecyclerView添加搜索過濾器的示例代碼
本篇文章主要介紹了Android RecyclerView添加搜索過濾器的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Android開發(fā)判斷一個app應用是否在運行的方法詳解
這篇文章主要介紹了Android開發(fā)判斷一個app應用是否在運行的方法,結合實例形式較為詳細的分析了Android判斷應用運行狀態(tài)的相關操作技巧與注意事項,需要的朋友可以參考下2017-11-11
Android實現動態(tài)圓環(huán)的圖片頭像控件
這篇文章主要為大家詳細介紹了Android實現帶有動態(tài)圓環(huán)的圓形圖片控件DynamicAvatarView的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Android Studio格式化(Format)代碼快捷鍵介紹
這篇文章主要介紹了Android Studio格式化(Format)代碼快捷鍵,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Android中使用DownloadManager類來管理數據下載的教程
這篇文章主要介紹了Android中使用DownloadManager類來管理數據下載的教程,針對HTTP下文件的下載與保存地址指定等基礎操作作出了詳細講解,需要的朋友可以參考下2016-04-04

