日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...

發布時間:2025/4/14 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在android學習中,動作交互是軟件中重要的一部分,其中的Scroller就是提供了拖動效果的類,在網上,比如說一些Launcher實現滑屏都可以通過這個類去實現。。 ? 例子相關博文:Android 仿 窗簾效果 和 登錄界面拖動效果 (Scroller類的應用) 附 2個DEMO及源碼 ? 在廣泛使用的側邊滑動導航開源庫 --SlidingLayer其實就是使用到了Scroller類進行的實現,下載地址:GITHUB? ,下面要講的不是這個庫,而是這個庫的實現過程中使用到的---Scroller類,懂了之后你看庫的源碼就知道,原來它是這樣實現的。 ? ? Scroller類使用過程中,懂得以下機制可能會對開發更有幫助: ? 1.視圖的VIEW的自定義以及其在屏幕中布局。 ? 2.scrollTo()和scrollBy()方法的作用區別 ? ? 可以點擊此處了解:android 布局之滑動探究 scrollTo 和 scrollBy 方法使用說明 ? 3.屏幕中的觸摸事件分發機制(這一塊在涉及到觸摸的任何情況下都十分重要) ? ? ? 首先看看發開文檔里面說了些什么:

android發開文檔

? 開發文檔參考鏈接:http://developer.android.com/reference/android/widget/Scroller.html

Scroller

一.結構關系

extends?Object ?

二.概述

Class Overview


This class encapsulates scrolling. You can use scrollers (Scroller?or?OverScroller) to collect the data you need to produce a scrolling animation—for example, in response to a fling gesture. Scrollers track scroll offsets for you over time, but they don't automatically apply those positions to your view. It's your responsibility to get and apply new coordinates at a rate that will make the scrolling animation look smooth.

?

?

這個類封裝了滾動操作,你可以根據你的手勢對界面進行更加平滑的滾動操作。 ?

?

To track the changing positions of the x/y coordinates, use?computeScrollOffset(). The method returns a boolean to indicate whether the scroller is finished. If it isn't, it means that a fling or programmatic pan operation is still in progress. You can use this method to find the current offsets of the x and y coordinates, for example:

?

跟蹤變化的x / y坐標的位置,通過computeScrollOffset()方法監聽返回的布爾值來指示滾動動作是否完成。如果返回為false,說明滾動已經結束。返回true,它意味著操作仍在進行中。您可以使用

int?currX?=?mScroller.getCurrX();????//滾動的X滾動距離

int?currY?=?mScroller.getCurrY();? ? ?//滾動的y滾動距離

這個方法來找到當前的x和y坐標的偏移量。

?

三.構造函數

Public Constructors
? Scroller(Context?context) Create a Scroller with the default duration and interpolator.
? Scroller(Context?context,?Interpolator?interpolator) Create a Scroller with the specified interpolator.
? Scroller(Context?context,?Interpolator?interpolator, boolean flywheel) Create a Scroller with the specified interpolator.

?Interpolator?interpolator 表示的是動畫插入器,你可以設定相應的效果給它。

?

Interpolator

implements?TimeInterpolator

android.view.animation.Interpolator

?

Known Indirect Subclasses

AccelerateDecelerateInterpolator,?AccelerateInterpolator,?AnticipateInterpolator,?AnticipateOvershootInterpolator,?BounceInterpolator,?CycleInterpolator,DecelerateInterpolator,?LinearInterpolator,?OvershootInterpolator

?

AccelerateDecelerateInterpolator? ? ?動畫效果:開始和結束都是緩慢的,通過中間時候加速

AccelerateInterpolator, ? ? ?動畫效果:開始緩慢,之后加速

AnticipateInterpolator, ??? ??動畫效果:開始后退,然后前進

AnticipateOvershootInterpolator,? ?動畫效果:開始后退,之后前進并超過終點位置,最終退回到終點

BounceInterpolator, ? ? ? ?動畫效果:慢慢反彈到,彈性衰減到結束

CycleInterpolator, ? ? ? ? ?動畫效果:重復循環動畫,速度變化遵循正弦定律

DecelerateInterpolator, ? ? ? ?動畫效果:剛開始快速,之后減速

LinearInterpolator, ? ? ? ??動畫效果:不斷的變化

OvershootInterpolator?? ? ? ??動畫效果:像前超越最終點然后回來

?

可以通過初始化構造方法Scroller(Context?context,?Interpolator?interpolator)給它相應的動畫效果。

?

Interpolator interpolator = new BounceInterpolator();

?

?

四.公共方法

?

Public Methods
void abortAnimation() ? ?停止動畫,滾到最終的x,y位置中止動畫
boolean computeScrollOffset() ? 當你想要知道新的位置時候,調用該方法。返回true:動畫沒結束
void extendDuration(int extend) ? 延長滾動動畫的時間。extend表示延遲時間(單位為毫秒)
void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) 在fling(快速滑動,觸摸屏幕后快意移動松開)的手勢基礎上開始滾動,滾動距離取決于fling的初速度。
final void forceFinished(boolean finished) ? 強制終止滾動。
float getCurrVelocity() ? 返回當前的速度
final int getCurrX() ? ?返回當前滾動的X方向的偏移量(距離原點X軸方向)
final int getCurrY() ??返回當前滾動的Y方向的偏移量(距離原點Y軸方向)
final int getDuration() ? 返回滾動事件的持續時間(毫秒)
final int getFinalX() ?返回滾動結束的X方向的偏移量(注:只針對fling 手勢有效)(距離原點X軸方向)
final int getFinalY()?? 返回滾動結束的Y方向的偏移量(注:只針對fling 手勢有效)(距離原點Y軸方向)
final int getStartX() ? 返回滾動起始點的X方向偏移量(距離原點X軸方向)
final int getStartY() ?返回滾動起始點的Y方向偏移量.(距離原點Y軸方向)
final boolean isFinished() ? 返回scroller滾動是否結束,true:滾動結束 ? ?false:還在滾動
void setFinalX(int newX) ?設置scroller的終止時X方向偏移量
void setFinalY(int newY) ??設置scroller的終止時Y方向偏移量
final void setFriction(float friction) The amount of friction applied to flings.
void startScroll(int startX, int startY, int dx, int dy) 提供起始點和滾動距離,調用該方法進行滾動。(此處默認時間為250ms)
void startScroll(int startX, int startY, int dx, int dy, int duration) 提供起始點和滾動距離以及滾動時間,調用該方法進行滾動。
int timePassed() ?返回自滾動開始經過的時間(毫秒)

?

源碼

下面看看以上方法的源碼實現:

知識點1:computeScrollOffset()方法

?

[java]?view plaincopy ?
  • /**?
  • ????*?Call?this?when?you?want?to?know?the?new?location.?If?it?returns?true,?
  • ????*?the?animation?is?not?yet?finished.?loc?will?be?altered?to?provide?the?
  • ????*?new?location.?
  • ????*/??
  • ???public?boolean?computeScrollOffset()?{??
  • ???????if?(mFinished)?{??
  • ???????????return?false;?//已經完成了本次動畫,直接返回為false????
  • ???????}??
  • ???????int?timePassed?=?(int)(AnimationUtils.currentAnimationTimeMillis()?-?mStartTime);??
  • ????
  • ???????if?(timePassed?<?mDuration)?{??
  • ???????????switch?(mMode)?{??
  • ???????????case?SCROLL_MODE:??
  • ???????????????float?x?=?timePassed?*?mDurationReciprocal;??
  • ????
  • ???????????????if?(mInterpolator?==?null)??
  • ???????????????????x?=?viscousFluid(x);??
  • ???????????????else??
  • ???????????????????x?=?mInterpolator.getInterpolation(x);??
  • ????
  • ???????????????mCurrX?=?mStartX?+?Math.round(x?*?mDeltaX);??
  • ???????????????mCurrY?=?mStartY?+?Math.round(x?*?mDeltaY);??
  • ???????????????break;??
  • ???????????case?FLING_MODE:??
  • ???????????????final?float?t?=?(float)?timePassed?/?mDuration;??
  • ???????????????final?int?index?=?(int)?(NB_SAMPLES?*?t);??
  • ???????????????float?distanceCoef?=?1.f;??
  • ???????????????float?velocityCoef?=?0.f;??
  • ???????????????if?(index?<?NB_SAMPLES)?{??
  • ???????????????????final?float?t_inf?=?(float)?index?/?NB_SAMPLES;??
  • ???????????????????final?float?t_sup?=?(float)?(index?+?1)?/?NB_SAMPLES;??
  • ???????????????????final?float?d_inf?=?SPLINE_POSITION[index];??
  • ???????????????????final?float?d_sup?=?SPLINE_POSITION[index?+?1];??
  • ???????????????????velocityCoef?=?(d_sup?-?d_inf)?/?(t_sup?-?t_inf);??
  • ???????????????????distanceCoef?=?d_inf?+?(t?-?t_inf)?*?velocityCoef;??
  • ???????????????}??
  • ???????????????mCurrVelocity?=?velocityCoef?*?mDistance?/?mDuration?*?1000.0f;??
  • ????????????????
  • ???????????????mCurrX?=?mStartX?+?Math.round(distanceCoef?*?(mFinalX?-?mStartX));??
  • ???????????????//?Pin?to?mMinX?<=?mCurrX?<=?mMaxX??
  • ???????????????mCurrX?=?Math.min(mCurrX,?mMaxX);??
  • ???????????????mCurrX?=?Math.max(mCurrX,?mMinX);??
  • ????????????????
  • ???????????????mCurrY?=?mStartY?+?Math.round(distanceCoef?*?(mFinalY?-?mStartY));??
  • ???????????????//?Pin?to?mMinY?<=?mCurrY?<=?mMaxY??
  • ???????????????mCurrY?=?Math.min(mCurrY,?mMaxY);??
  • ???????????????mCurrY?=?Math.max(mCurrY,?mMinY);??
  • ???????????????if?(mCurrX?==?mFinalX?&&?mCurrY?==?mFinalY)?{??
  • ???????????????????mFinished?=?true;??
  • ???????????????}??
  • ???????????????break;??
  • ???????????}??
  • ???????}??
  • ???????else?{??
  • ???????????mCurrX?=?mFinalX;??
  • ???????????mCurrY?=?mFinalY;??
  • ???????????mFinished?=?true;??
  • ???????}??
  • ???????return?true;??
  • ???}??
  • ?

    調用該方法判斷滾動是否還在繼續,mFinished屬性判斷是否滾動完成,如果滾動完成了,mFinished = true,computeScrollOffset()?返回false。

    ?

    知識點2:computeScroll()方法

    ?

    [java]?view plaincopy ?
  • /**?
  • ?*?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.?
  • ?*/由父視圖調用用來請求子視圖根據偏移值?mScrollX,mScrollY重新繪制????
  • public?void?computeScroll()?{??
  • }??
  • ?

    知道了computeScrollOffset()這個判斷是否滾動的方法,那我們必須要有監聽滑屏控制,并且重繪,在Android框架中的VIEW類中就提供了computeScroll()這個方法去控制該流程。在繪制View時,會在draw()過程調用該方法。因此,?再配合使用Scroller實例,我們就可以獲得當前應該的偏移坐標,手動使View/ViewGroup偏移至該處。

    注:在使用Scroller這個類實現偏移控制,一般自定義View/ViewGroup都需要重載該方法 。

    具體實現:

    ?

    [java]?view plaincopy ?
  • @Override??
  • ????public?void?computeScroll()?{??
  • ????????if?(mScroller.computeScrollOffset())?{??
  • ????????????scrollTo(mScroller.getCurrX(),?mScroller.getCurrY());??
  • ????????????//?更新界面??
  • ????????????postInvalidate();??
  • ????????????isMoving?=?true;??
  • ????????}?else?{??
  • ????????????isMoving?=?false;??
  • ????????}??
  • ????????super.computeScroll();??
  • ????}??
  • ?

    ?

    知識點3:startScroll()方法

    [java]?view plaincopy ?
  • /**?
  • ????*?Start?scrolling?by?providing?a?starting?point?and?the?distance?to?travel.?
  • ????*?
  • ????*?@param?startX??//水平方向滾動的偏移值,以像素為單位。正值表明滾動將向左滾動?
  • ????*?@param?startY??//垂直方向滾動的偏移值,以像素為單位。正值表明滾動將向上滾動?
  • ????*?@param?dx?//水平方向滑動的距離,正值會使滾動向左滾動?
  • ????*?@param?dy?//垂直方向滑動的距離,正值會使滾動向上滾動?
  • ????*?@param?duration?//滾動持續時間?
  • ????*/??
  • ???public?void?startScroll(int?startX,?int?startY,?int?dx,?int?dy,?int?duration)?{??
  • ???????mMode?=?SCROLL_MODE;??
  • ???????mFinished?=?false;??
  • ???????mDuration?=?duration;??
  • ???????mStartTime?=?AnimationUtils.currentAnimationTimeMillis();??
  • ???????mStartX?=?startX;??
  • ???????mStartY?=?startY;??
  • ???????mFinalX?=?startX?+?dx;??
  • ???????mFinalY?=?startY?+?dy;??
  • ???????mDeltaX?=?dx;??
  • ???????mDeltaY?=?dy;??
  • ???????mDurationReciprocal?=?1.0f?/?(float)?mDuration;??
  • ???}??
  • 該方法以提供的起始點和將要滑動的距離開始滾動,我們可以使用該方法達到自動滾動的效果。在滾動中,如果符合什么條件,可以調用該方法讓它滾動到相對應的地方。

    ?

    著重點:

    在界面滾動中,你必須搞清楚和scrollTo和scrollBy之間的區別所在:android 布局之滑動探究 scrollTo 和 scrollBy 方法使用說明

    ? 需要注意的是,移動的時候向左移動為負,向下移為負。示意圖如下:

    ?

    使用思路流程:

    如果你使用Scroller,流程如下:

    1.可以在自定義的布局中,按照需求初始化Scroller構造函數。

    2.重寫onInterceptTouchEvent(MotionEvent ev)方法,看看是否要攔截相關的點擊時間。

    3.重寫onTouchEvent(MotionEvent event)方法,根據觸摸屏上的動作使用computeScroll()以及scrollTo 和 scrollBy?方法進行根據手指對布局進行滑動效果。

    4.在觸摸操作結束(MotionEvent.ACTION_UP)的時候,調用startScroll(int startX, int startY, int dx, int dy, int duration)方法,進行動畫自動操作,來完成整個滾動流程。

    ?

    對于Scroller類大體的使用和介紹已經完畢,之后會放上自己調用類實現的幾個漂亮的效果。

    ?

    版權聲明:本文為博主原創文章,未經博主允許不得轉載。

    轉載于:https://www.cnblogs.com/Free-Thinker/p/4785014.html

    總結

    以上是生活随笔為你收集整理的Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产青青视频 | 久久久久久久久久久99 | 国产免费一区二区 | 亚洲在线a | 国产黄色大片视频 | 久久久无码精品亚洲国产 | 人民的名义第二部 | 中国性xxx | 亚洲精品一二三四区 | 欧美精品二区三区四区免费看视频 | 久久久久久久伊人 | 久久免费视频精品 | 国产乱淫av片免费 | 色涩久久 | 国产精品美女www爽爽爽视频 | 婷婷激情成人 | 亚洲红桃视频 | 色婷婷六月天 | 精品日韩一区二区三区四区 | 亚洲高清在线一区 | 国产浮力第一页 | 国产亚洲片 | 亚洲女人在线 | 97国产成人无码精品久久久 | 亚洲福利视频一区二区 | 久久青青操 | 国产伦精品一区二区三区免费迷 | 欧美福利一区二区三区 | 黄色激情毛片 | 玩偶游戏在线观看免费 | 妞妞影视 | 亚洲高清天堂 | 成人99| 香蕉日日 | 午夜国产在线观看 | 亚洲第一色网 | 极品少妇xxxx精品少妇 | 少妇特黄一区二区三区 | 久久久久久久久久久久久久av | 91漂亮少妇露脸在线播放 | 先锋成人 | 黄色a级免费| 不卡一区二区在线视频 | 国产电影一区二区三区爱妃记 | av午夜天堂 | αv在线| 欧美乱码精品一区二区三区 | 中文字幕第七页 | 久久99影院 | 中文人妻一区二区三区 | www.五月婷婷.com | 久久国产成人 | 91精品久久久久久久久久入口 | 亚洲一区二区三区四区在线观看 | av第一福利 | 国内爆初菊对白视频 | 一本一道久久综合 | 女性裸体下面张开 | 阿v视频在线免费观看 | 欧美一区二区三区免费视频 | 在线免费观看福利 | 日本黄色成人 | 国产一区二区在线免费 | 波多野结衣在线播放 | 麻豆成人精品国产免费 | 亚洲第二色 | 色综合色综合 | 久久11 | 久久久久久久久久久久久女过产乱 | 美女免费毛片 | www久久久久久 | 亚洲欧美字幕 | 在线观看日本视频 | 欧美日韩aa| 波多野结衣视频在线 | 夜夜伊人| 欧美人性生活视频 | 日韩在线国产 | 放荡的少妇2欧美版 | 国产精品久久久久久久久久 | 素人女裸体 | 久久九九国产精品 | 天天天天 | 中文字幕永久在线播放 | 韩国av一区二区三区 | 久久久久亚洲av无码网站 | 91精品国产麻豆国产自产在线 | 91精品视频观看 | 日本在线一区二区三区 | 伊人av综合| 91av毛片| 久久精品在线视频 | 精品人妻无码专区在线 | 精品视频在线观看免费 | 日韩国产一区 | 一级欧美在线 | 国产黄色免费在线观看 | 亚洲精品欧洲精品 | 亚洲一区二区国产精品 |