日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android 使用 Scroller 實現(xiàn)平滑滾動功能的示例代碼

瀏覽:122日期:2022-09-23 13:37:38

記錄使用Scroller實現(xiàn)平滑滾動,效果圖如下:

Android 使用 Scroller 實現(xiàn)平滑滾動功能的示例代碼

一、自定義View中實現(xiàn)View的平滑滾動

public class ScrollerView extends View { private Scroller mScroller; private Paint mPaint; /** * 屏幕拖動最小像素 */ private int mTouchSlop; /** * View寬度 */ private int width; /** * View高度 */ private int height; /** * MotionEvent.getX() */ private int mEventX; /** * MotionEvent.getY() */ private int mEventY; private Bitmap mBitmap; /** * View到屏幕左邊距離 */ private int mStartX; /** * View到屏幕頂部距離 */ private int mStartY; /** * View默認大小 */ private static int DEFAULT_SIZE = 200; public ScrollerView(Context context) { this(context, null); } public ScrollerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mScroller = new Scroller(context); ViewConfiguration configuration = ViewConfiguration.get(context); mTouchSlop = ViewConfigurationCompat.getScaledHoverSlop(configuration); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY) { width = MeasureSpec.getSize(widthMeasureSpec); } else { if (heightMode == MeasureSpec.EXACTLY) { width = MeasureSpec.getSize(heightMeasureSpec); } else { width = DEFAULT_SIZE; } } if (heightMode == MeasureSpec.EXACTLY) { height = MeasureSpec.getSize(heightMeasureSpec); } else { height = width; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (null != mBitmap) { Rect src = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); Rect dst = new Rect(0, 0, width, height); canvas.drawBitmap(mBitmap, src, dst, mPaint); } else { Log.e('zzy', 'Bitmap is null'); } } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: mEventX = (int) event.getX(); mEventY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: mStartX = (int) event.getRawX() - mEventX; mStartY = (int) event.getRawY() - mEventY; layout(mStartX,mStartY,mStartX+width,mStartY+height); break; case MotionEvent.ACTION_UP: startScroller(); break; } return true; } @Override public void computeScroll() { if (mScroller.computeScrollOffset()){ int l = mScroller.getCurrX(); layout(l,mStartY,l+width,mStartY+height); invalidate(); } } /** * 開始Scroller動畫 */ private void startScroller(){ mScroller.forceFinished(true); mScroller.startScroll(mStartX, mStartY,-mStartX,0); int screenWidth = getScreenWidth(); // Scroller動畫默認250ms,超過屏幕一半時設置為500ms if (mStartX > screenWidth / 2){ mScroller.extendDuration(500); } invalidate(); } private int getScreenWidth(){ return getResources().getDisplayMetrics().widthPixels; }}

Scroller其實是個輔助類,本身并不能完成動畫的執(zhí)行。而是幫我們計算隨著時間的流逝,動畫應該執(zhí)行的位置值,我們需要獲得當前時間的位置,然后調(diào)用View位置移動方法,將View移動到該位置,完成動畫。

所以,在自定義View中。我們需要調(diào)用invalidate()觸發(fā)View的重繪,并覆寫重繪會執(zhí)行的方法computeScroll()。

在computeScroll()方法中調(diào)用Scroller的computeScrollOffset()計算當前時間動畫應該移動的位置,返回值是動畫是否在執(zhí)行。

通過mScroller.getCurrX()和mScroller.getCurrY()獲得當前時間的位置。手動調(diào)用View位置移動的方法將View的位置移動到當前時間的位置,實現(xiàn)View的滾動。

然后再次調(diào)用invalidate()觸發(fā)刷新。直到computeScrollOffset()返回false,動畫執(zhí)行完成,滾動完成。

二、直接使用Scroller實現(xiàn)View的平滑滾動

我們知道,Scroller會幫我們計算當前時間,插值器返回的值。

而如果直接使用Scroller實現(xiàn)平滑滾動的話,也需要借助帶時間的監(jiān)聽器。

這里借助ValueAnimator來實現(xiàn)Scroller平滑滾動

private Scroller mScroller; private ImageView mImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImage = findViewById(R.id.image); mScroller =new Scroller(this); } public void btnStart(View view){ start(); } private void start(){ mScroller.forceFinished(false); mScroller.extendDuration(500); mScroller.startScroll(0,0,400,400); ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1); valueAnimator.setDuration(500); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if (mScroller.computeScrollOffset()){ ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mImage.getLayoutParams(); params.leftMargin = mScroller.getCurrX(); params.topMargin = mScroller.getCurrY(); mImage.setLayoutParams(params); } } }); valueAnimator.start(); }

在ValueAnimator的addUpdateListener中刷新Scroller當前值。并移動位置。效果如下:

Android 使用 Scroller 實現(xiàn)平滑滾動功能的示例代碼

到此這篇關(guān)于Android 使用 Scroller 實現(xiàn)平滑滾動的文章就介紹到這了,更多相關(guān)android Scroller 平滑滾動內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品mm| 99久久www免费| 日韩中文字幕区一区有砖一区 | 麻豆一区二区三| 国产精品porn| 国产精品原创| 伊人久久成人| 亚洲精品在线二区| 国产午夜久久av| 成午夜精品一区二区三区软件| 中文字幕在线视频网站| 欧美/亚洲一区| 日韩综合小视频| 久久精品国产精品亚洲毛片| 色偷偷偷在线视频播放| 在线精品小视频| 国产乱码精品一区二区三区亚洲人| 欧美精品99| 狠狠爱www人成狠狠爱综合网| 日韩精品一区二区三区中文字幕| 麻豆精品一区二区综合av| 久久久精品久久久久久96| 日本不卡不码高清免费观看 | 福利视频一区| 亚洲视频二区| 日韩免费视频| 国产欧美日韩影院| 亚洲高清毛片| 国产一区二区三区免费在线| 欧美日韩高清| 国语精品一区| 日韩中文字幕在线一区| 色婷婷精品视频| 麻豆成人在线观看| 在线国产精品一区| 日韩精品网站| 国产一区一一区高清不卡| 免费成人av在线播放| 国产在线观看91一区二区三区| 中文日韩在线| 久久久精品日韩| 日本久久综合| 久久久久伊人| 91精品国产自产精品男人的天堂 | 在线看片福利| 精品色999| 你懂的国产精品永久在线| 亚洲三级在线| 视频在线在亚洲| 亚洲人成毛片在线播放女女| 91成人精品视频| 国产99精品| 激情欧美日韩一区| 中文字幕在线视频网站| 欧美激情aⅴ一区二区三区 | av亚洲免费| 亚洲先锋成人| 激情视频一区二区三区| 久久精品主播| 日韩视频在线一区二区三区 | 精品国产18久久久久久二百| 久久这里只有精品一区二区| 欧美交a欧美精品喷水| 国产欧美精品久久| 久久精品国产精品亚洲毛片| 精品日产乱码久久久久久仙踪林| 精品一区二区三区中文字幕视频| 欧美激情视频一区二区三区免费 | 久久精品国产www456c0m| 久久精品一区二区不卡| 亚洲精品97| 影院欧美亚洲| 亚洲字幕久久| 国产精品mm| 成人啊v在线| 欧美资源在线| 麻豆国产精品777777在线| zzzwww在线看片免费| 中文一区在线| 久久伊人国产| 在线视频免费在线观看一区二区| 日日摸夜夜添夜夜添国产精品| 国产精品xxx在线观看| 日韩天堂在线| 亚洲一二三区视频| 手机在线电影一区| 亚洲高清二区| 日韩精品乱码av一区二区| 久久夜夜操妹子| 日本午夜精品一区二区三区电影| 91免费精品| 日韩动漫一区| 婷婷精品进入| 久久精品国产网站| 综合激情视频| 欧美在线观看视频一区| 国产精品中文字幕亚洲欧美| 少妇精品导航| 国产精品qvod| 亚洲欧洲免费| 国产亚洲毛片| 福利一区二区免费视频 | 首页国产欧美日韩丝袜| 综合精品一区| 免费人成网站在线观看欧美高清| 国产免费成人| 99香蕉国产精品偷在线观看| 国产亚洲永久域名| 国产精品免费精品自在线观看| 国产精品www994| av在线资源| 久久xxxx精品视频| 91成人在线精品视频| 欧美激情 亚洲a∨综合| 日韩中文在线电影| 中文另类视频| 亚洲理论在线| 成人黄色av| 国产一区福利| 亚洲天堂1区| 在线看片不卡| 中文字幕一区二区三区四区久久| 鲁大师影院一区二区三区| 中国女人久久久| 日本不卡在线视频| 牛牛精品成人免费视频| 国产精品精品| 免费黄色成人| 中文字幕亚洲在线观看| 欧美日韩一视频区二区| 日韩毛片一区| 色婷婷综合网| 久久亚洲欧洲| 乱一区二区av| 亚洲激情中文| 国产精品videosex极品| 日韩综合精品| 日韩亚洲精品在线观看| 麻豆国产精品一区二区三区| 日韩一区二区三区免费| 最新国产精品| 999久久久国产精品| 国产亚洲第一伦理第一区| 91精品国产福利在线观看麻豆| 日韩精品一二三| 欧美自拍一区| 欧美精品一区二区久久| 国产美女撒尿一区二区| 亚洲精品2区| 成人国产精选| 欧美久久亚洲| 奶水喷射视频一区| 欧美日一区二区三区在线观看国产免| 奇米色欧美一区二区三区| 樱桃成人精品视频在线播放| 另类中文字幕国产精品| 福利视频一区| 精品91福利视频| 亚洲一级少妇| 日韩欧美午夜| 国产精品色婷婷在线观看| 中文字幕日韩欧美精品高清在线| 亚洲高清激情| 伊人久久亚洲影院| 欧美特黄一区| 模特精品在线| 日本大胆欧美人术艺术动态| 成人午夜精品| 91精品韩国| 午夜久久免费观看| 99在线观看免费视频精品观看| 欧美日韩国产综合网| 男女精品网站| 日韩毛片网站| 久久激情五月激情| 日本成人中文字幕| 久久久久亚洲精品中文字幕| 精品视频一区二区三区在线观看 | 欧美亚洲网站| 国产精品羞羞答答在线观看| 国产日产一区| 美女网站视频一区| 亚洲高清激情| 日本亚洲欧洲无免费码在线| 国产精品亚洲二区| 三上悠亚国产精品一区二区三区| 影音先锋久久| 亚洲精品大全| 日本激情一区| 99视频精品免费观看| 日本一区二区三区中文字幕| 精品视频99| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品99在线| 天堂va蜜桃一区二区三区| 欧美一区不卡| 久久久精品午夜少妇| 免费观看亚洲| 久久久久99| 日韩精品久久理论片|