android onpagescrolled 参数,Android
8種機械鍵盤軸體對比
本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?
背景
ViewPager 在應用中使用較為廣泛,諸如頁面輪播圖,App引導頁,大圖預覽等。其中指示器頁比較重要
它用于提示用戶當前的頁面狀態,使得應用更具交互性。
PagerTitleStrip
PagerTitleStrip 內置的指示器,布局作為ViewPager的一個子View,需要設置android:layout_gravity=TOP/BOTTOM
但效果總不是太理想,多數情況,大都自定義一個Indicator,放在ViewPager的外部,通過ViewPager的onScroll方法,更新Indicator的位置效果等
自定義 Indicator
初步歸納為3步,自定義View,布局文件引用自定義View,關聯自定義View與ViewPager
自定義 PageIndicator
class PageIndicator extends RelativeLayout {
@Override
PageIndicator(context, attrs, defStyleAttr) {}
// ...
}
布局文件引用
android:id="@+id/music_indicator"
android:layout_width="match_parent"
android:layout_height="48dp" />
android:id="@+id/music_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
關聯ViewPager
mPageIndicator.setViewPager(mViewPager)
// 并設置指示器的內容
mPageIndicator.addIndicators(getIndicators())
private fun getIndicators(): ArrayList {
val items = ArrayList()
return items
}
控制Indicator行為
重寫onPageScrolled,點擊Indicator實現ViewPager翻頁,跨頁跳轉時的屬性動畫
關鍵方法:onPageScrolled()
ViewPager.OnPageChangeListener.onPageScrolled()
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
val litem = getIndicator(position)
val ritem = getIndicator(position + 1)
litem?.setActiveState(1 - positionOffset)
ritem?.setActiveState(positionOffset)
}
跨頁切換 ViewPager 動畫
當前頁面個數為4,從第一頁直接跳轉到第4頁時,能明顯感覺到2、3 兩頁頁顯示出來了。
mViewPager.setCurrentItem(toItemIndex, true)
其原因就是直接在onPageScrolled在這種場景下發生了回調,從而導致Indicator的行為改變。所以,應該在點擊頂部指示器的時候,
屏蔽掉onPageScrolled里對指示器的控制,在點擊時添加指示器的動畫
animF.addListener(object : SimpleAnimator() {
override fun onAnimationEnd(animation: Animator?) {
indicator.isMenuItemClicked = false
}
})
animF.start()
// onPageScrolled() 里
if (isMenuItemClicked) {
// click the menu item, do animation directly
return
}
litem?.setActiveState(1 - positionOffset)
ritem?.setActiveState(positionOffset)
屬性動畫
ValueAnimator.ofFloat(0, 1)
ValueAnimator.setDuration(250) // 默認的頁面切換時間
ValueAnimator.addAmimator(onAnimationEnd())
如何獲取進入界面和退出界面
由于ViewPager的currentItem在滑動過程中是變化的,不能作為參考。 從第0頁滑動到第1頁position:0 , offset: 0.0->1.0f, currentItem: 當offset>0.5f的時候,會被更新為1
從第1頁滑動到第0頁position:0 , offset: 1.0->0.0f, currentItem: 當offset<0.5f的時候,會被更新為0
從第1頁滑動到第2頁position:1 , offset: 0.0->1.0f, currentItem: 當offset>0.5f的時候,會被更新為2
從第2頁滑動到第1頁position:1 , offset: 1.0->0.0f, currentItem: 當offset<0.5f的時候,會被更新為1
從第2頁滑動到第3頁position:2 , offset: 0.0->1.0f, currentItem: 當offset>0.5f的時候,會被更新為3
從第3頁滑動到第2頁position:2 , offset: 1.0->0.0f, currentItem: 當offset<0.5f的時候,會被更新為2
可以看出,position在左滑或者右滑時,始終保持不變,offset的變化值始終是滑動過程中的右邊頁面。
即:能定位到當前滑動頁的左邊和右邊頁,從而有效的控制指示器的行為
以position = 1舉例:
如果offset從0到1,說明是從第1頁滑向第2頁。本次滑動過程中: 左邊頁是第1頁,右邊是第2頁,offset從0~1,進入動畫
如果offset從1到0,說明是從第2頁滑向第1頁。本次滑動過程中: 左邊頁是第1頁,右邊是第2頁,offset從1~0,退出動畫
總結
關鍵數據 position,是onPageScrolled的第一個參數onPageScrolled(int position, *, **)
滑動過程中的左邊頁的需要即為 position, 而右邊頁對應就是 position + 1 所以才有下面的寫法
val litem = getIndicator(position)
val ritem = getIndicator(position + 1)
總結
以上是生活随笔為你收集整理的android onpagescrolled 参数,Android的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 每分钟广播,每1分钟An
- 下一篇: android软件的data使用方法,实