2013-04-20 47 views
2

动画应该做到以下几点:垂直屏裂转换(动画)

  1. 垂直分割屏幕分为两个部分。
  2. 上部向上移动。
  3. 下半部分向下移动。
  4. 最后,逆向。 (关闭屏幕)

enter image description here

回答

9

的想法很简单:

  1. 保存活动为您提供为位图
  2. 分割位分为两个部分
  3. 动画位图向外(上下)

为了让活动的位图:

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

+0

+1哇!太棒了!非常感谢! :)我现在就试试! – Roylee 2013-04-20 04:31:37

+0

那么它支持API 8? – Roylee 2013-04-20 07:08:11

+1

@Roylee实际上,我们需要编写我们自己的代码,以便在代码中使用上层android api。 – 2013-04-20 09:11:09