Androidフレックススライド
2086 ワード
1、ViewScrollerでスライド
2、アニメーションを使う
3、遅延ロードHandlerの使用
/**
* scroller.startScroll() , scrollX deltaX mFinalX
* invalidate() draw() ,draw() computeScroll() , View
* computeScroll() , ,
* scrollTo(scroller.getCurrX(), scroller.getCurrY()), getCurrX() mFinalX
* , postInvalidate() view
*/
Scroller scroller = new Scroller(mContext);
private void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int deltaX = destX - scrollX;
// 1000ms destX,
scroller.startScroll(scrollX, 0, deltaX, 0, 1000);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
2、アニメーションを使う
final int startX = 0;
final int deltaX = 100;
final Button mButton = new Button(mContext);
ValueAnimator animator = ValueAnimator.ofInt(0, 1).setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
float fraction = animator.getAnimatedFraction();
mButton.scrollTo(startX + (int) (deltaX * fraction), 0);
}
});
animator.start();
3、遅延ロードHandlerの使用
private static final int MESSAGE_SCROLL_TO = 1;
private static final int FRAME_COUNT = 30;
private static final int DELAYED_TIME = 33;
private int mCount = 0;
private Button mButton;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_SCROLL_TO:
mCount++;
if (mCount <= FRAME_COUNT) {
float fraction = mCount / (float) FRAME_COUNT;
int scrollX = (int) (fraction * 100);
mButton.scrollTo(scrollX, 0);
mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO, DELAYED_TIME);
}
break;
}
}
};