亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Android 使用 Scroller 實現平滑滾動功能的示例代碼

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

記錄使用Scroller實現平滑滾動,效果圖如下:

Android 使用 Scroller 實現平滑滾動功能的示例代碼

一、自定義View中實現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其實是個輔助類,本身并不能完成動畫的執行。而是幫我們計算隨著時間的流逝,動畫應該執行的位置值,我們需要獲得當前時間的位置,然后調用View位置移動方法,將View移動到該位置,完成動畫。

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

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

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

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

二、直接使用Scroller實現View的平滑滾動

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

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

這里借助ValueAnimator來實現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 實現平滑滾動功能的示例代碼

到此這篇關于Android 使用 Scroller 實現平滑滾動的文章就介紹到這了,更多相關android Scroller 平滑滾動內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 国产一二三四五路线 | 成年免费大片黄在线观看一 | 天天久久| 色偷偷亚洲女人天堂观看欧 | 青青青爽国产在线视频 | 在线毛片一区二区不卡视频 | 中国性视频 | 亚洲人成在线精品不卡网 | 亚洲成人在线观看视频 | 香蕉黄视频 | 久久精品免视看国产明星 | 丁香六月色婷婷 | 久久国产视频网 | 亚洲丶国产丶欧美一区二区三区 | 日韩免费黄色片 | 一级不卡毛片免费 | 青草视频在线观看视频 | hh99me福利毛片 | 噜噜噜噜精品视频在线观看 | 国产亚洲视频在线 | 福利综合网 | 高清欧美日韩一区二区三区在线观看 | 中文字幕亚洲精品日韩精品 | 欧美爱片 | 黄色免费网站在线看 | 同性男男黄h片在线播放免费 | 国产高清在线a视频大全 | 国产精品福利网站 | 99视频都是精品热在线播放 | 18到20岁女人毛片一区 | 国产美女视频黄a视频免费全过程 | jdav视频在线观看 | 国产精品亚洲综合 | 国产精品免费看久久久香蕉 | 伊人网影院 | 免费播放美女一级毛片 | 久久午夜精品2区 | 91这里只有精品 | 视频在线观看rrr在线观看 | 69堂在线观看国产成人 | 国产中字 |