Android 는 Scroller 를 사용 하여 부 드 러 운 스크롤 기능 을 구현 하 는 예제 코드 를 사용 합 니 다.
6697 단어 androidScroller부 드 럽 게 스크롤
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()
방법 에서 호출Scroller
의computeScrollOffset()
은 현재 시간 에 애니메이션 이 이동 해 야 할 위 치 를 계산 합 니 다.반환 값 은 애니메이션 이 실행 되 고 있 는 지 여부 입 니 다.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 의 부 드 러 운 스크롤 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.