亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android自定義View彈性滑動Scroller詳解

發布時間:2020-10-15 15:05:48 來源:腳本之家 閱讀:309 作者:_爬蟲 欄目:移動開發

本文實例為大家分享了Android彈性滑動類Scroller的具體代碼,供大家參考,具體內容如下

Scroller是什么

Scroller就是一個滑動幫助類。它并不可以使View真正的滑動,而是配合scrollTo/ScrollBy讓view產生緩慢的滑動,產生動畫的效果,其實和屬性動畫是同一個原理。在我看來,Scroller跟屬性動畫的平移的效果是一樣的。

如何使用

 //①實例一個Scroller,它有三個構造方法如下
  //public Scroller (Context context)
  //public Scroller (Context context, Interpolator interpolator)//傳入一個時間插值器
  //public Scroller (Context context, Interpolator interpolator, boolean flywheel)
  Scroller mScroller=new Scroller(context);

  //②使用Scroller
  //startScroll()傳入一些參數:開始位置,結束位置,開始時間滑動到結束位置的完成時間。
  mScrooler.startScroll(int startX,int startY,int endx,int endY,int duration);
  invalidate();//在ViewGroup中,invalidate()方法會導致computeScroll()方法的執行

  //③在computeScroll()的方法中判斷:mScroller是否結束,如果沒有結束就調用scrollTo()讓view處于正確的位置
  @Override
  public void computeScroll() {
   //computeScrollOffset()判斷是否還在滾動,如果還在滾動,會獲取到某一時刻view應該所在的位置,刷新Scroller中mCurrX,mCurrY的值,并且return true;
   if (mScroller.computeScrollOffset()) {
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    //更新界面
    postInvalidate();
   }
   super.computeScroll();
  }

使用示例:

package com.liujian.chart;

/**
 * Scroller練習,一個簡單的ViewPager
 * @author : liujian
 * @since : 2017/12/17
 */

public class ScrollLayout extends ViewGroup {
 private Scroller mScroller;
 //當前設備滑動的最小距離
 private int mTouchSlop;

 private int leftBorder;//布局內容的左邊界
 private int rightBorder;//布局內容的右邊界

 private float mRawXDown;
 private float mRawXMove;
 private float mRawXLastMove;

 public ScrollLayout(Context context) {
  super(context);
  initView(context);
 }

 public ScrollLayout(Context context, @Nullable AttributeSet attrs) {
  super(context, attrs);
  initView(context);
 }

 public ScrollLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  initView(context);
 }

 private void initView(Context context) {
  mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
  mScroller = new Scroller(getContext());
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  //為ScrollLayout中的某一個子View給出一個建議的測量大小和測量模式
  measureChildren(widthMeasureSpec, heightMeasureSpec);
 }

 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  int childCount = getChildCount();
  for (int i = 0; i < childCount; i++) {
   View view = getChildAt(i);
   view.layout(i * view.getMeasuredWidth(), 0, (i + 1) * view.getMeasuredWidth(), view.getMeasuredHeight());
  }
  leftBorder = getChildAt(0).getLeft();
  rightBorder = getChildAt(getChildCount() - 1).getRight();
 }

 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  switch (ev.getAction()) {
   case MotionEvent.ACTION_DOWN:
    mRawXDown = ev.getRawX();
    mRawXLastMove = mRawXDown;
    break;
   case MotionEvent.ACTION_MOVE:
    mRawXMove = ev.getRawX();
    mRawXLastMove = mRawXMove;
    float distance = Math.abs(mRawXMove - mRawXDown);
    //左右滑動時,攔截子view的觸摸事件
    if (distance > mTouchSlop) {
     return true;
    }
    break;
   case MotionEvent.ACTION_UP:
    break;
  }
  return super.onInterceptTouchEvent(ev);
 }

 @SuppressLint("ClickableViewAccessibility")
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_MOVE:
    mRawXMove = event.getRawX();
    int distanceX = (int) (mRawXLastMove - mRawXMove);
    //對邊界異常情況的處理
    if (getScrollX() + distanceX < leftBorder) {
     scrollBy(leftBorder, 0);
    }
    if (getScrollX() + getWidth() + distanceX > rightBorder) {
     scrollBy(rightBorder - getWidth(), 0);
    }
    scrollBy(distanceX, 0);
    mRawXLastMove = mRawXMove;
    break;
   case MotionEvent.ACTION_UP:
    //當前所在的page頁面
    int targetIndex = (getScrollX() + getWidth() / 2) / getWidth();
    int dx = targetIndex * getWidth() - getScrollX();
    Log.i("TAG", "dx: " + dx);
    Log.i("TAG", "getScrollX: " + getScrollX());
    Log.i("TAG", "getWidth: " + getWidth());

    // 第二步,調用startScroll()方法來初始化滾動數據并刷新界面
    mScroller.startScroll(getScrollX(), 0, dx, 0);
    invalidate();
    break;
  }
  return super.onTouchEvent(event);
 }

 @Override
 public void computeScroll() {
  if (mScroller.computeScrollOffset()) {
   scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
   invalidate();
  }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安多县| 阿城市| 九台市| 黔西| 鄂州市| 柳江县| 北宁市| 平遥县| 荥经县| 锦屏县| 宁城县| 达州市| 侯马市| 石屏县| 繁峙县| 山东省| 天气| 海口市| 景泰县| 长泰县| 高阳县| 东海县| 威宁| 紫云| 轮台县| 宁都县| 沂水县| 叶城县| 哈巴河县| 敦煌市| 青河县| 清原| 革吉县| 商南县| 武冈市| 永泰县| 武城县| 南平市| 错那县| 湛江市| 梅河口市|