Android 는 Scroller 를 사용 하여 부 드 러 운 스크롤 기능 을 구현 하 는 예제 코드 를 사용 합 니 다.

기록 은 스크롤 러 를 사용 하여 부 드 러 운 스크롤 을 실현 합 니 다.효과 도 는 다음 과 같 습 니 다.
在这里插入图片描述
1.사용자 정의 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()방법 에서 호출ScrollercomputeScrollOffset()은 현재 시간 에 애니메이션 이 이동 해 야 할 위 치 를 계산 합 니 다.반환 값 은 애니메이션 이 실행 되 고 있 는 지 여부 입 니 다.mScroller.getCurrX()mScroller.getCurrY()를 통 해 현재 시간의 위 치 를 얻 을 수 있 습 니 다.View 위 치 를 수 동 으로 이동 하 는 방법 으로 View 의 위 치 를 현재 시간의 위치 로 이동 시 켜 View 의 스크롤 을 실현 합 니 다.
그리고 다시 호출invalidate()하여 리 셋 을 촉발 합 니 다.computeScrollOffset()false 로 돌아 갈 때 까지 애니메이션 실행 이 완료 되 고 스크롤 이 완 료 됩 니 다.
2.Scroller 를 직접 사용 하여 View 의 부 드 러 운 스크롤 을 실현 합 니 다.
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();
 }
ValueAnimatoraddUpdateListener에서 Scroller 현재 값 을 새로 고 칩 니 다.위 치 를 이동 합 니 다.효 과 는 다음 과 같 습 니 다:
在这里插入图片描述
안 드 로 이 드 가 Scroller 를 사용 하여 부 드 러 운 스크롤 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 Scroller 의 부 드 러 운 스크롤 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기