Androidフレックススライド

2086 ワード

1、ViewScrollerでスライド
/**
 *   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;
        }
    }
};