Android Scroller簡單用法

來源:互聯網
上載者:User

標籤:scoller

1.知識點

  • 在瞭解Scorller類之前應Crowdsourced Security Testing道View的ScrollTo(int x, int y)/ScrollBy(int x, int y),瞭解什麼是視圖座標,什麼是布局座標。之後我們來看一下Scroller的源碼。

Scoller一般用在自訂View中

public class Scroller  {        private int mStartX;    //起始座標點 ,  X軸方向      private int mStartY;    //起始座標點 ,  Y軸方向      private int mCurrX;     //當前座標點  X軸, 即調用startScroll函數後,經過一定時間所達到的值      private int mCurrY;     //當前座標點  Y軸, 即調用startScroll函數後,經過一定時間所達到的值           private float mDeltaX;  //應該繼續滑動的距離, X軸方向      private float mDeltaY;  //應該繼續滑動的距離, Y軸方向      private boolean mFinished;  //是否已經完成本次滑動操作, 如果完成則為 true        //建構函式      public Scroller(Context context) {          this(context, null);      }      public final boolean isFinished() {          return mFinished;      }      //強制結束本次滑屏操作      public final void forceFinished(boolean finished) {          mFinished = finished;      }      public final int getCurrX() {          return mCurrX;      }       /* Call this when you want to know the new location.  If it returns true,      * the animation is not yet finished.  loc will be altered to provide the      * new location. */        //根據當前已經消逝的時間計算當前的座標點,儲存在mCurrX和mCurrY值中      public boolean computeScrollOffset() {          if (mFinished) {  //已經完成了本次動畫控制,直接返回為false              return false;          }          int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);          if (timePassed < mDuration) {              switch (mMode) {              case SCROLL_MODE:                  float x = (float)timePassed * mDurationReciprocal;                  ...                  mCurrX = mStartX + Math.round(x * mDeltaX);                  mCurrY = mStartY + Math.round(x * mDeltaY);                  break;              ...          }          else {              mCurrX = mFinalX;              mCurrY = mFinalY;              mFinished = true;          }          return true;      }      //開始一個動畫控制,由(startX , startY)在duration時間內前進(dx,dy)個單位,即到達座標為(startX+dx , startY+dy)出      public void startScroll(int startX, int startY, int dx, int dy, int duration) {          mFinished = false;          mDuration = duration;          mStartTime = AnimationUtils.currentAnimationTimeMillis();          mStartX = startX;       mStartY = startY;          mFinalX = startX + dx;  mFinalY = startY + dy;          mDeltaX = dx;            mDeltaY = dy;          ...      }  }  

一些方法介紹

mScroller.getCurrX() //擷取mScroller當前水平滾動的位置  mScroller.getCurrY() //擷取mScroller當前豎直滾動的位置  mScroller.getFinalX() //擷取mScroller最終停止的水平位置  mScroller.getFinalY() //擷取mScroller最終停止的豎直位置  mScroller.setFinalX(int newX) //設定mScroller最終停留的水平位置,沒有動畫效果,直接跳到目標位置  mScroller.setFinalY(int newY) //設定mScroller最終停留的豎直位置,沒有動畫效果,直接跳到目標位置    //滾動,startX, startY為開始滾動的位置,dx,dy為滾動的位移量, duration為完成滾動的時間  mScroller.startScroll(int startX, int startY, int dx, int dy) //使用預設完成時間250ms  mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)    mScroller.computeScrollOffset() //傳回值為boolean,true說明滾動尚未完成,false說明滾動已經完成。這是一個很重要的方法,通常放在View.computeScroll()中,用來判斷是否滾動是否結束。
  • View的computeScroll()方法使用,此方法在繪製View的每一個子view時都被調用
2.舉例實現下拉重新整理的效果        
 主要代碼:
public class CustomView extends RelativeLayout {private static final String TAG = "CustomView";private Scroller mScroller;private GestureDetector mGestureDetector;public boolean flag = true;public StateListener stateListener;public CustomView(Context context) {this(context, null);}public CustomView(Context context, AttributeSet attrs) {super(context, attrs);setClickable(true);setLongClickable(true);mScroller = new Scroller(context);mGestureDetector = new GestureDetector(context, new CustomGestureListener());}public interface StateListener{public void changeText();public void recoverText();}public void setStateListener(StateListener statelistener){this.stateListener = statelistener;}//調用此方法滾動到目標位置public void smoothScrollTo(int fx, int fy) {int dx = fx - mScroller.getFinalX();int dy = fy - mScroller.getFinalY();smoothScrollBy(dx, dy);}//調用此方法設定滾動的相對位移public void smoothScrollBy(int dx, int dy) {//設定mScroller的滾動位移量mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);invalidate();//這裡必須調用invalidate()才能保證computeScroll()會被調用,否則不一定會重新整理介面,看不到滾動效果}//在繪製View時,會在draw()程序呼叫該方法。@Overridepublic void computeScroll() {//先判斷mScroller滾動是否完成if (mScroller.computeScrollOffset()) {//這裡調用View的scrollTo()完成實際的滾動scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必須調用該方法,否則不一定能看到滾動效果postInvalidate();}super.computeScroll();}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_UP :Log.i(TAG, "get Sy" + getScrollY());System.out.println(getScrollX()+"x--"+getScrollY()+"y");smoothScrollTo(0, 0);System.out.println("up");break;default:int distance = getScrollY();System.out.println("distance"+distance);if(distance <= 0){flag = true;if(distance > -200){stateListener.recoverText();}else if(distance < -200){stateListener.changeText();}return mGestureDetector.onTouchEvent(event);}else{flag = false;return false;}}return super.onTouchEvent(event);}class CustomGestureListener implements GestureDetector.OnGestureListener {@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn true;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {if(flag){int dis = (int)((distanceY-0.5)/4);Log.i(TAG, dis + ".");smoothScrollBy(0, dis);}return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stube1.getY();e2.getY();System.out.println(e1.getY()+"------"+e2.getY());return false;}}}




Android Scroller簡單用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.