垂直屏幕分割转换(动画)

时间:2013-04-20 02:59:20

标签: android animation split

动画应该执行以下操作:

  1. 将屏幕垂直分为两部分。
  2. 上部向上移动。
  3. 下部向下移动。
  4. 最后,反向。 (关闭屏幕)
  5. enter image description here

1 个答案:

答案 0 :(得分:11)

这个想法很简单:

  1. 将您的活动A保存为位图
  2. 将位图拆分为2部分
  3. 向外设置位图(向上和向下)
  4. 为了获得活动的位图:

    View root = currActivity.getWindow().getDecorView().findViewById(android.R.id.content);
    root.setDrawingCacheEnabled(true);
    Bitmap bmp = root.getDrawingCache();
    

    为了分割位图:

    int splitYCoord = (splitYCoord != -1 ? splitYCoord : bmp.getHeight() / 2);
    if (splitYCoord > bmp.getHeight())
                throw new IllegalArgumentException("Split Y coordinate [" + splitYCoord + "] exceeds the activity's height [" + bmp.getHeight() + "]");
    Bitmap mBmp1 = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), splitYCoord);
    Bitmap mBmp2 = Bitmap.createBitmap(bmp, 0, splitYCoord, bmp.getWidth(), bmp.getHeight() - splitYCoord);
    private static int[] mLoc1;
    private static int[] mLoc2;
    mLoc1 = new int[]{0, root.getTop()};
    mLoc2 = new int[]{0, root.getTop() + splitYCoord};
    private static ImageView mTopImage;
    private static ImageView mBottomImage;
    mTopImage = createImageView(destActivity, mBmp1, mLoc1);
    mBottomImage = createImageView(destActivity, mBmp2, mLoc2);
    
    private static ImageView createImageView(Activity destActivity, Bitmap bmp, int loc[]) {
        ImageView imageView = new ImageView(destActivity);
        imageView.setImageBitmap(bmp);
    
        WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();
        windowParams.gravity = Gravity.TOP;
        windowParams.x = loc[0];
        windowParams.y = loc[1];
        windowParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        windowParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
        windowParams.flags =
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
        windowParams.format = PixelFormat.TRANSLUCENT;
        windowParams.windowAnimations = 0;
        destActivity.getWindowManager().addView(imageView, windowParams);
    
        return imageView;
    }
    

    创建位图后,应用动画

    AnimatorSet mSetAnim = new AnimatorSet();
    mTopImage.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    mBottomImage.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    mSetAnim.addListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            clean(destActivity);
                        }
    
                        @Override
                        public void onAnimationCancel(Animator animation) {
                            clean(destActivity);
                        }
                            ...
                    });
    
    Animator anim1 = ObjectAnimator.ofFloat(mTopImage, "translationY", mTopImage.getHeight() * -1);
    Animator anim2 = ObjectAnimator.ofFloat(mBottomImage, "translationY", mBottomImage.getHeight());
    
    mSetAnim.setDuration(duration);
    mSetAnim.playTogether(anim1, anim2);
    mSetAnim.start();
    
    private void clean(Activity activity) {
        if (mTopImage != null) {
            mTopImage.setLayerType(View.LAYER_TYPE_NONE, null);
            try {
                activity.getWindowManager().removeViewImmediate(mBottomImage);
            } catch (Exception ignored) {}
        }
        if (mBottomImage != null) {
            mBottomImage.setLayerType(View.LAYER_TYPE_NONE, null);
            try {
                activity.getWindowManager().removeViewImmediate(mTopImage);
            } catch (Exception ignored) {}
        }
    
        mBmp1 = null;
        mBmp2 = null;
    }
    

    以上代码仅供参考。您可以从以下链接中找到完整的演示。

    参考链接:ActivitySplitAnimation