ActivitySplitAnimationUtil 打开Activity动画工具类
来源:互联网 发布:角落生物 淘宝 编辑:程序博客网 时间:2024/05/18 01:04
package com.example.welcome;import android.animation.Animator;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.animation.TimeInterpolator;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Handler;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.view.animation.DecelerateInterpolator;import android.widget.ImageView;/** * Utility class to create a split activity animation * * @author Udi Cohen (@udinic) */@SuppressLint("NewApi")public class ActivitySplitAnimationUtil { public static Bitmap mBitmap = null; private static int[] mLoc1; private static int[] mLoc2; private static ImageView mTopImage; private static ImageView mBottomImage; private static AnimatorSet mSetAnim; /** * Start a new Activity with a Split animation * * @param currActivity The current Activity * @param intent The Intent needed tot start the new Activity * @param splitYCoord The Y coordinate where we want to split the Activity on the animation. -1 will split the Activity equally */ public static void startActivity(Activity currActivity, Intent intent, int splitYCoord) { // Preparing the bitmaps that we need to show prepare(currActivity, splitYCoord); currActivity.startActivity(intent); currActivity.overridePendingTransition(0, 0); } /** * Start a new Activity with a Split animation right in the middle of the Activity * * @param currActivity The current Activity * @param intent The Intent needed tot start the new Activity */ public static void startActivity(Activity currActivity, Intent intent) { startActivity(currActivity, intent, -1); } /** * Preparing the graphics on the destination Activity. * Should be called on the destination activity on Activity#onCreate() BEFORE setContentView() * * @param destActivity the destination Activity */ public static void prepareAnimation(final Activity destActivity) { mTopImage = createImageView(destActivity, mBitmap, mLoc1); mBottomImage = createImageView(destActivity, mBitmap, mLoc2); } /** * Start the animation the reveals the destination Activity * Should be called on the destination activity on Activity#onCreate() AFTER setContentView() * * @param destActivity the destination Activity * @param duration The duration of the animation * @param interpolator The interpulator to use for the animation. null for no interpulation. */ public static void animate(final Activity destActivity, final int duration, final TimeInterpolator interpolator) { // Post this on the UI thread's message queue. It's needed for the items to be already measured new Handler().post(new Runnable() { @Override public void run() { 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 onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { clean(destActivity); } @Override public void onAnimationCancel(Animator animation) { clean(destActivity); } @Override public void onAnimationRepeat(Animator animation) { } }); // Animating the 2 parts away from each other Animator anim1 = ObjectAnimator.ofFloat(mTopImage, "translationY", mTopImage.getHeight() * -1); Animator anim2 = ObjectAnimator.ofFloat(mBottomImage, "translationY", mBottomImage.getHeight()); if (interpolator != null) { anim1.setInterpolator(interpolator); anim2.setInterpolator(interpolator); } mSetAnim.setDuration(duration); mSetAnim.playTogether(anim1, anim2); mSetAnim.start(); } }); } /** * Start the animation that reveals the destination Activity * Should be called on the destination activity on Activity#onCreate() AFTER setContentView() * * @param destActivity the destination Activity * @param duration The duration of the animation */ public static void animate(final Activity destActivity, final int duration) { animate(destActivity, duration, new DecelerateInterpolator()); } /** * Cancel an in progress animation */ public static void cancel() { if (mSetAnim != null) mSetAnim.cancel(); } /** * Clean stuff * * @param activity The Activity where the animation is occurring */ private static void clean(Activity activity) { if (mTopImage != null) { mTopImage.setLayerType(View.LAYER_TYPE_NONE, null); try { // If we use the regular removeView() we'll get a small UI glitch 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) { } } mBitmap = null; } /** * Preparing the graphics for the animation * * @param currActivity the current Activity from where we start the new one * @param splitYCoord The Y coordinate where we want to split the activity. -1 will split the activity equally */ private static void prepare(Activity currActivity, int splitYCoord) { // Get the content of the activity and put in a bitmap View root = currActivity.getWindow().getDecorView().findViewById(android.R.id.content); root.setDrawingCacheEnabled(true); mBitmap = root.getDrawingCache(); // If the split Y coordinate is -1 - We'll split the activity equally splitYCoord = (splitYCoord != -1 ? splitYCoord : mBitmap.getHeight() / 2); if (splitYCoord > mBitmap.getHeight()) throw new IllegalArgumentException("Split Y coordinate [" + splitYCoord + "] exceeds the activity's height [" + mBitmap.getHeight() + "]"); // Set the location to put the 2 bitmaps on the destination activity Log.i("prepare", root.getTop()+""); Log.i("prepare", splitYCoord+""); mLoc1 = new int[]{0, splitYCoord, root.getTop()}; mLoc2 = new int[]{splitYCoord, mBitmap.getHeight(), root.getTop()}; } /** * Creating the an image, containing one part of the animation on the destination activity * * @param destActivity The destination activity * @param bmp The Bitmap of the part we want to add to the destination activity * @param loc The location this part should be on the screen * @return */ private static ImageView createImageView(Activity destActivity, Bitmap bmp, int loc[]) { MyImageView imageView = new MyImageView(destActivity); imageView.setImageBitmap(bmp); imageView.setImageOffsets(bmp.getWidth(), loc[0], loc[1]); WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(); windowParams.gravity = Gravity.TOP; windowParams.x = 0; windowParams.y = loc[2] + loc[0]; windowParams.height = loc[1] - loc[0]; windowParams.width = bmp.getWidth(); windowParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; windowParams.format = PixelFormat.TRANSLUCENT; windowParams.windowAnimations = 0; destActivity.getWindowManager().addView(imageView, windowParams); return imageView; } /** * MyImageView * Extended ImageView that draws just part of an image, base on start/end position */ private static class MyImageView extends ImageView { private Rect mSrcRect; private Rect mDstRect; private Paint mPaint; public MyImageView(Context context) {super(context);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);}/** * Setting the bitmap offests to control the visible area * * @param width The bitmap image * @param bmp The start Y position * @param loc The end Y position * @return */public void setImageOffsets(int width, int startY, int endY){mSrcRect = new Rect(0, startY, width, endY);mDstRect = new Rect(0, 0, width, endY - startY);}@Overrideprotected void onDraw(Canvas canvas){Bitmap bm = null;Drawable drawable = getDrawable();if (null != drawable && drawable instanceof BitmapDrawable){bm = ((BitmapDrawable)drawable).getBitmap();}if (null == bm){super.onDraw(canvas);}else{canvas.drawBitmap(bm, mSrcRect, mDstRect, mPaint);}} }}
0 0
- ActivitySplitAnimationUtil 打开Activity动画工具类
- Activity中心打开动画效果工具类
- Activity进入动画工具类
- activity打开不需要动画
- Android Activity打开关闭动画
- 定义工具类中函数随时打开某Activity
- 设置打开新Activity的动画效果
- 打开或关闭Activity的动画
- 为打开新Activity动作添加动画效果
- 为打开新Activity动作添加动画效果
- 为打开新Activity动作添加动画效果
- 为打开新Activity动作添加动画效果
- 为打开新Activity动作添加动画效果
- 设置activity打开关闭动画——左右滑入滑出
- 为打开新Activity动作添加动画效果
- 使用overridePendingTransition()方法,打开、关闭activity有动画
- 设置activity打开关闭动画——左右滑入滑出
- android activity刚打开时内部动画卡顿问题
- 把dmp导入远程数据库中
- 你所不能不知道的Matlab使用技巧
- Win8.1下QT4.8集成开发环境的搭建
- Hadoop之map/reduce介绍
- ps命令
- ActivitySplitAnimationUtil 打开Activity动画工具类
- weblogic 学习
- 数据抽象与封装
- OpenCV4Android 环境配置(最新详细教程)
- GoogleMap在js中的应用
- FileNotFound: File /etc/iscsi/initiatorname.iscsi-openstack挂载cinder问题
- nodejs操作mongodb
- A,B两个整数集合,设计一个算法求他们的交集
- Python 读写文件的几种方式