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

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

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

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

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

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

一、自定義View中實(shí)現(xiàn)View的平滑滾動(dòng)

public class ScrollerView extends View { private Scroller mScroller; private Paint mPaint; /** * 屏幕拖動(dòng)最小像素 */ 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默認(rèn)大小 */ 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(); } } /** * 開(kāi)始Scroller動(dòng)畫 */ private void startScroller(){ mScroller.forceFinished(true); mScroller.startScroll(mStartX, mStartY,-mStartX,0); int screenWidth = getScreenWidth(); // Scroller動(dòng)畫默認(rèn)250ms,超過(guò)屏幕一半時(shí)設(shè)置為500ms if (mStartX > screenWidth / 2){ mScroller.extendDuration(500); } invalidate(); } private int getScreenWidth(){ return getResources().getDisplayMetrics().widthPixels; }}

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

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

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

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

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

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

我們知道,Scroller會(huì)幫我們計(jì)算當(dāng)前時(shí)間,插值器返回的值。

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

這里借助ValueAnimator來(lái)實(shí)現(xiàn)Scroller平滑滾動(dòng)

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當(dāng)前值。并移動(dòng)位置。效果如下:

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

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲在线观看| 在线天堂中文资源最新版| 久久精品影视| 日韩在线免费| 电影天堂国产精品| 久久美女精品| www.com.cn成人| 99久久99视频只有精品| 久久精品青草| 性欧美69xoxoxoxo| 日韩午夜av| 免费观看在线综合| 日韩高清不卡在线| 国产精品一区二区中文字幕| 麻豆一区在线| 日韩大片在线观看| 香蕉人人精品| 在线一区免费观看| 亚洲一级大片| 国产精品白丝久久av网站| 国语精品一区| 日韩国产一区二区三区| 欧美日韩国产在线观看网站| 久热精品在线| 国产精品久久久久久久久久齐齐 | 日本欧洲一区二区| 天堂久久一区| 久久只有精品| 群体交乱之放荡娇妻一区二区| 亚洲精品午夜av福利久久蜜桃| 久久国产99| 欧美一区免费| 国产精品黑丝在线播放| 亚洲二区三区不卡| 日韩高清一区二区| 国产aa精品| 在线亚洲欧美| 国产精品色在线网站| 日韩久久视频| 亚洲一级大片| 久久久久久久欧美精品| 久久超级碰碰| 99久久亚洲精品蜜臀| 蜜臀精品久久久久久蜜臀| 欧美亚洲专区| 欧美日韩尤物久久| 中文字幕成人| 日产精品一区二区| 蜜臀av亚洲一区中文字幕| 欧美激情视频一区二区三区免费| 日韩影院二区| 亚洲免费毛片| 欧美精品日日操| 日本a级不卡| 久久精品亚洲人成影院| 奇米狠狠一区二区三区| 丰满少妇一区| 国产一级久久| 美女视频黄免费的久久| 在线 亚洲欧美在线综合一区| 国产视频一区二| 亚洲视频综合| 欧美精品aa| 伊人久久婷婷| 精品久久中文| 深夜福利一区| 久久高清精品| 老司机精品视频网| 老牛国产精品一区的观看方式| 国产成人免费精品| 亚洲v天堂v手机在线| 精品国产免费人成网站| 在线精品亚洲| 欧美一级鲁丝片| 青草久久视频| 99pao成人国产永久免费视频| 麻豆国产精品| 美国三级日本三级久久99 | 欧美日本三区| 一区在线观看| www在线观看黄色| 日韩高清在线不卡| 香蕉久久99| 成人亚洲一区| 国产精品成人国产| 色综合视频一区二区三区日韩 | 久久丁香四色| 日韩精品午夜视频| 午夜欧美精品| 久久久久.com| 久久伊人国产| 欧美视频精品全部免费观看| 久久不射中文字幕| 欧美亚洲国产激情| 久久精品欧洲| 88久久精品| 亚洲精品日本| 蜜桃av一区| 一区二区自拍| 欧美日韩一区二区三区视频播放| 成人污污视频| 国产福利一区二区精品秒拍| 日韩福利视频导航| 免费成人av在线播放| 午夜国产精品视频免费体验区| 少妇久久久久| 一区二区三区四区日本视频| 久久影视三级福利片| 国产亚洲电影| 综合一区av| 美女黄网久久| 亚洲欧美高清| 免费日韩视频| 水野朝阳av一区二区三区| 夜夜嗨一区二区三区| 午夜精品免费| 91久久视频| 香蕉久久国产| 免费高清在线一区| 亚洲香蕉视频| 亚洲我射av| 伊人久久亚洲| 日韩精品中文字幕一区二区| 亚洲精品在线a| 在线视频亚洲欧美中文| 蜜臀久久99精品久久久久宅男| 免费一区二区视频| 亚洲精品日本| 日韩激情视频网站| 日本在线一区二区三区| 欧美日韩视频免费看| 国产伦理一区| 荡女精品导航| 成人免费电影网址| 欧美91精品| 欧美中文字幕| 日韩影片在线观看| 国产精品极品在线观看| 久久精品国产成人一区二区三区| 国产精品久久久久9999高清| 久久精品午夜| 久久一级电影| 视频一区中文字幕国产| 91国内精品| 国产成人精品三级高清久久91| 色天使综合视频| 尹人成人综合网| 日本成人精品| 精品免费av| 波多野结衣一区| 国产精品美女| 久久国产精品免费一区二区三区| 麻豆成人91精品二区三区| 国产传媒在线观看| 久久久久久久久久久妇女| 黄色亚洲精品| 911精品国产| 国产h片在线观看| 欧美日韩国产高清| 日韩av资源网| 精品久久精品| 欧美精品九九| 国产精品亚洲欧美| 久久国产毛片| 亚洲狼人精品一区二区三区| 久久av电影| 欧美不卡在线| 日韩精彩视频在线观看| 色婷婷亚洲mv天堂mv在影片| 国产一区亚洲| 日韩毛片网站| 国产福利电影在线播放| 黄页网站一区| 国产美女视频一区二区| 日韩高清中文字幕一区二区| 美女精品在线| 精品黄色一级片| 亚洲深夜av| 麻豆精品视频在线| 精品在线91| 国产精品久久免费视频| 欧美影院三区| 国产精品网在线观看| 999国产精品永久免费视频app| 中文字幕成人| 麻豆精品视频在线观看| 亚洲激情另类| 美女视频黄免费的久久| 亚洲资源av| 国产福利电影在线播放| 亚洲精品国产日韩| 日韩免费小视频| 日韩国产欧美视频| 一区二区小说| 牛牛精品成人免费视频| 久久不射网站| 日韩网站中文字幕| 国产欧美亚洲精品a| 中文亚洲免费| www.51av欧美视频|