当我进行3D过渡时,动画会停止一段时间

时间:2011-09-02 11:22:31

标签: android

当我进行3D转换时,视图停止一段时间,然后旋转两个视图包含第一个视图列表视图和地图,第二个视图列表视图两个视图都与数据库交互

(代码块固定)

/**
 * Setup a new 3D rotation on the container view.
 *
 * @param position the item that was clicked to show a picture, or -1 to show the list
 * @param start the start angle at which the rotation must begin
 * @param end the end angle of the rotation
 */

private void applyRotation(int position, float start, float end) {
    // Find the center of the container
    final float centerX = mContainer.getWidth() / 2.0f;
    final float centerY = mContainer.getHeight() / 2.0f;

    final float centerX2 = mContainerView.getWidth() / 2.0f;
    final float centerY2 = mContainerView.getHeight() / 2.0f;

    // Create a new 3D rotation with the supplied parameter
    // The animation listener is used to trigger the next animation
    final Rotate3dAnimation rotation =
            new Rotate3dAnimation(start, end, centerX, centerY, 310.0f, true);
    rotation.setDuration(500);
    rotation.setFillAfter(true);
    rotation.setInterpolator(new AccelerateInterpolator());
    rotation.setAnimationListener(new DisplayNextView(position));

    mContainer.startAnimation(rotation);

    //for view
    final Rotate3dAnimation rotation2 =
            new Rotate3dAnimation(start, end, centerX2, centerY2, 310.0f, true);
    rotation2.setDuration(500);
    rotation2.setFillAfter(true);
    rotation2.setInterpolator(new AccelerateInterpolator());
    //rotation2.setAnimationListener(new DisplayNextView(position));
    mContainerView.startAnimation(rotation2);
}

/**
 * This class listens for the end of the first half of the animation.
 * It then posts a new action that effectively swaps the views when the container
 * is rotated 90 degrees and thus invisible.
 */

private final class DisplayNextView implements Animation.AnimationListener {
    private final int mPosition;

    private DisplayNextView(int position) {
        mPosition = position;
    }

    public void onAnimationStart(Animation animation) {
    }

    public void onAnimationEnd(Animation animation) {
        mContainer.post(new SwapViews(mPosition));
    }

    public void onAnimationRepeat(Animation animation) {
    }
}

/**
 * This class is responsible for swapping the views and start the second
 * half of the animation.
 */

private final class SwapViews implements Runnable {
    private final int mPosition;

    public SwapViews(int position) {
        mPosition = position;
    }

    public void run() {
        final float centerX = mContainer.getWidth() / 2.0f;
        final float centerY = mContainer.getHeight() / 2.0f;
        Rotate3dAnimation rotation;

        final float centerX2 = mContainerView.getWidth() / 2.0f;
        final float centerY2 = mContainerView.getHeight() / 2.0f;
        Rotate3dAnimation rotation2;

        if (mPosition==2) {
            mButtonCounty.setVisibility(Button.GONE);
            mButtonRadar.setVisibility(Button.VISIBLE);
            mButtonRadar.requestFocus();

            mNearShopsView.setVisibility(LinearLayout.GONE);
            mCountyListView.setVisibility(RelativeLayout.VISIBLE);
            mCountyListView.requestFocus();

            rotation = new Rotate3dAnimation(90, 180, centerX, centerY, 310.0f, false);

            rotation2 = new Rotate3dAnimation(90,180, centerX2, centerY2, 310.0f, false);
        } else {
            mButtonRadar.setVisibility(Button.GONE);
            mButtonCounty.setVisibility(Button.VISIBLE);
            mButtonCounty.requestFocus();

            mCountyListView.setVisibility(RelativeLayout.GONE);
            mNearShopsView.setVisibility(LinearLayout.VISIBLE);
            mNearShopsView.requestFocus();

            rotation = new Rotate3dAnimation(90, 0, centerX, centerY, 310.0f, false);
            rotation2 = new Rotate3dAnimation(90,0, centerX2, centerY2, 310.0f, true);
        }

        rotation.setDuration(50);
        rotation.setFillAfter(false);
        rotation.setInterpolator(new DecelerateInterpolator());

        mContainer.startAnimation(rotation);

        rotation2.setDuration(50);
        rotation2.setFillAfter(false);
        rotation2.setInterpolator(new DecelerateInterpolator());

        mContainerView.startAnimation(rotation2);
    }
}

1 个答案:

答案 0 :(得分:0)

在进行非3D交易时,你会得到这个“停止”吗?如果没有,那么您应该为您的观点启用DrawingCache。这主要在TextViews中起作用,因为它们在动画的每一步都重绘自己。将View.setDrawingCacheEnabled(true);设置为您的观看次数。