-1

ギャラリーの中央のビューがズームアウトアニメーションを表示しているカスタムギャラリーを作成したいと思います。そのため、ギャラリーをスクロールすると、中央に来るアイテムがズームされます。だから私が知る必要があるのは:

  1. ギャラリーで中央のアイテムを見つけるにはどうすればよいですか(5つのアイテムが表示されている場合、中央のアイテムとして3番目のアイテムが必要です)。
  2. スクロールが発生したときにスムーズな膨らみ効果を得るために、どのようにアニメーション化できますか?
4

1 に答える 1

0

キューを使用したパイプのような構造の助けを借りて、GalleryのaddViewToLayoutメソッドと組み合わせたときにそれを取得しました。

コード:

カスタムギャラリークラス

public class NGallery extends Gallery {

private Pipe<View> childViews;
private int pipeSize;
private View previousAnimatedView;
private boolean isScrollLeft;

public NGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
    final Timer tmr = new Timer();
    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            initialize();
            if (pipeSize > 0) {
                tmr.cancel();
            }
        }
    };
    tmr.scheduleAtFixedRate(task, 100, 100);
}

private void initialize() {
    View childView = getChildAt(0);
    if (childView != null && childView.getWidth() > 0) {
        pipeSize = getWidth() / childView.getWidth();
        childViews = new Pipe<View>(pipeSize);
    }
}

@Override
protected boolean addViewInLayout(View child, int index,
        android.view.ViewGroup.LayoutParams params,
        boolean preventRequestLayout) {
    View viewToAnimate = getViewToAnimate(child);
    if (viewToAnimate != null) {
        if (previousAnimatedView != null) {
            previousAnimatedView.clearAnimation();
        }
        viewToAnimate.requestFocus();
        AnimationSet animationSet = getAnimationSet(viewToAnimate);
        viewToAnimate.startAnimation(animationSet);
        previousAnimatedView = viewToAnimate;
    }
    return super
            .addViewInLayout(child, index, params, preventRequestLayout);
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    isScrollLeft = distanceX > 0;
    return super.onScroll(e1, e2, distanceX, distanceY);
}

private AnimationSet getAnimationSet(View viewToAnimate) {
    AnimationSet animationSet = new AnimationSet(false);

    Animation scaleAnimation = new ScaleAnimation(1, 1.5f, 1, 1.5f);
    scaleAnimation.setDuration(100);
    animationSet.addAnimation(scaleAnimation);

    Animation transAnimation = new TranslateAnimation(0, 0, 0, 25);
    transAnimation.setDuration(100);
    animationSet.addAnimation(transAnimation);

    animationSet.setFillAfter(true);

    return animationSet;
}

private View getViewToAnimate(View child) {
    if (childViews != null) {
        if (isScrollLeft) {
            childViews.addFirst(child);
        } else {
            childViews.addLast(child);
        }
        return childViews.getCenterItem();
    } else {
        return null;
    }
}

}

パイプクラス:

public class Pipe<E> {

private LinkedList<E> list;
private int pipeSize;

public Pipe(int size) {
    list = new LinkedList<E>();
    pipeSize = size;
}

public E getItemAt(int position) {
    return list.get(position);
}

public E getCenterItem() {
    int pos = pipeSize / 2;
    if (pos < list.size()) {
        return list.get(pos);
    } else {
        return null;
    }
}

public void addFirst(E item) {
    if (list.size() >= pipeSize) {
        list.removeLast();
    }
    list.addFirst(item);
}

public void addLast(E item) {
    if (list.size() >= pipeSize) {
        list.removeFirst();
    }
    list.addLast(item);
}

}
于 2012-09-28T20:48:59.553 に答える