91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

温州市| 玛沁县| 丹凤县| 临漳县| 奉贤区| 宜良县| 锡林浩特市| 三穗县| 东乡县| 台安县| 会泽县| 延吉市| 双辽市| 兴宁市| 彭水| 沂南县| 尖扎县| 洞头县| 郸城县| 博湖县| 涟水县| 鹤山市| 资中县| 东方市| 酒泉市| 乡城县| 安多县| 会东县| 恩平市| 安义县| 镶黄旗| 彰武县| 天祝| 兴安县| 沙洋县| 乐清市| 枣强县| 邮箱| 广昌县| 张掖市| 青田县|