中心打开效果
来源:互联网 发布:php echo 数组 编辑:程序博客网 时间:2024/04/28 14:23
现在给加大分享一下打开Activity时中心打开的效果。
思路:
1.在设置打开目标Aitivity的时,先获取当前Acitivty,设置分割的背景的坐标。
2.当目标Activity打开之前,根据分割的坐标,创建ImageView,上下两部分,并且添加到目标Activity中。
3.最后设置上下两部分IMageView的动画,是他们一起开启动画。
4.当动画结束后,要把目标Activity中的添加的两个ImageView移除掉。
下面通过代码来实现:
设置开启目标Activity
public static void startActivity(Activity currActivity, Intent intent,int splitYCoord) {// 准备一个BItMap图片,是当前的Activity界面作为的背景prepare(currActivity, splitYCoord);currActivity.startActivity(intent);currActivity.overridePendingTransition(0, 0);}currActivity:当前的Activity
intent:开启新的Activity的Intent
splitYCoord:想去分割Activity的纵坐标,-1表示平等的从中间分割
在这个方法里,最主要的功能获取当前Acitivity界面作为一个Bitmap
private static void prepare(Activity currActivity, int splitYCoord) {// 获取当前的Activity,作为一个BItMapView 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 equallysplitYCoord = (splitYCoord != -1 ? splitYCoord: mBitmap.getHeight() / 2);if (splitYCoord > mBitmap.getHeight())throw new IllegalArgumentException("Split Y coordinate ["+ splitYCoord + "] exceeds the activity's height ["+ mBitmap.getHeight() + "]");// 设置给两个上下BitMap的坐标,是给目标Activity制作的动画的ImageView提供的坐标mLoc1 = new int[] { 0, splitYCoord, root.getTop() };mLoc2 = new int[] { splitYCoord, mBitmap.getHeight(), root.getTop() };}
主要是获取当前的Activity的内容,生成一个BitMap,然后根据分割标记,把分割的上下两部分ImageView的坐标划分出来
在目标的Activity中oncreate()的Activity的onCreate()中的setContentView()前面调用准备动画
public static void prepareAnimation(final Activity destActivity) {mTopImage = createImageView(destActivity, mBitmap, mLoc1);mBottomImage = createImageView(destActivity, mBitmap, mLoc2);}创建分割的ImageView,并且添加到目标Activity的窗体上
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;}
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);}}}开启动画
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 measurednew Handler().post(new Runnable() {@Overridepublic void run() {mSetAnim = new AnimatorSet();mTopImage.setLayerType(View.LAYER_TYPE_HARDWARE, null);mBottomImage.setLayerType(View.LAYER_TYPE_HARDWARE, null);mSetAnim.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {clean(destActivity);}@Overridepublic void onAnimationCancel(Animator animation) {clean(destActivity);}@Overridepublic void onAnimationRepeat(Animator animation) {}});// Animating the 2 parts away from each otherAnimator 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();}});}
当动画结束,移除目标Activity的ImageView。
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// glitchactivity.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;}
如果想给其他View设置中心打开效果,那么就按照这三步执行即可
使用步骤:
我这是创建了一个BaseActivity,把准备动画和开启动画放在了BaseAcitivity中
activity01.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/num1" android:gravity="center" android:text="我是美女一号" android:textColor="@android:color/holo_blue_light" android:textSize="30sp" /></RelativeLayout>activity02.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/num2" android:gravity="center" android:text="我是不是很萌" android:textColor="@android:color/holo_green_dark" android:textSize="30sp" /></RelativeLayout>activity03.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/bg3" android:gravity="center" android:text="风景是不是很美" android:textColor="@android:color/holo_orange_dark" android:textSize="30sp" /></RelativeLayout>activity04.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/bg4" android:gravity="center" android:text="想不想拥有一个豪车" android:textColor="@android:color/holo_red_dark" android:textSize="30sp" /></RelativeLayout>
BaseActivity.java
public class BaseActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// 准备好动画,创建了上一个Activity的以中间为线ActivitySplitAnimationUtil.prepareAnimation(this);super.onCreate(savedInstanceState);// 开启动画ActivitySplitAnimationUtil.animate(this, 2000);}}
Activity1.java
public class Activity1 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity01);findViewById(R.id.button).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 此时就会把当前的activity作为中间分割动画的背景了ActivitySplitAnimationUtil.startActivity(Activity1.this,new Intent(Activity1.this, Activity2.class));}});}}Activity2.java
public class Activity2 extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity02);findViewById(R.id.button).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {ActivitySplitAnimationUtil.startActivity(Activity2.this,new Intent(Activity2.this, Activity3.class));}});}}Activity3.java
public class Activity3 extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity03);findViewById(R.id.button).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {ActivitySplitAnimationUtil.startActivity(Activity3.this,new Intent(Activity3.this, Activity4.class));}});}}Activity4.java
public class Activity4 extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity04);}}
源码下载:http://download.csdn.net/detail/forwardyzk/8332101
如果效果图看不到,请使用360安全浏览器查看。不知道为什么在谷歌浏览器上gif图片显示不出来。
知道怎样解决的请给你建议。
效果图:
0 0
- 中心打开效果
- 中心打开式 效果不错
- Activity中心打开动画效果工具类
- 中心向右对齐效果
- 围绕中心旋转动画效果
- Android 个人中心波纹效果
- ubuntu中软件中心不能打开解决方案
- Ubuntu软件中心无法打开解决方法!
- 打开小米安全中心的权限管理
- 仿微信游戏中心效果——ExpandableListView
- 个人中心顶部图片拉伸效果
- 模仿小米安全中心的进度效果
- 实现简书个人中心UI效果
- android 个人中心下拉弹回效果-PullscrollView
- 动画效果打开新窗口
- 打开,收起的效果
- 打开网页渐变效果
- 模仿小米安全中心检测效果(进度条效果)
- ASP.NET MVC 4 的JS/CSS打包压缩功能-------过滤文件
- 扫雷游戏代码
- [转]从一道面试题谈linux下fork的运行机制
- 函数指针 && 返回函数指针的函数的一些姿势
- Redis之利用锁机制来防止缓存过期产生的惊群现象
- 中心打开效果
- Asp.net 使用正则过滤信息
- Client端上传文件,SpringMVC端multipartResolver接收处理
- Linux语言环境设置
- 大雄的疑惑(学习与考试的关系)
- eclipse设置
- [Unity3D]使用link.xml来控制strippinglevel减少dll库大小技巧、优化安装包大小
- 发的是公司的规划好地方
- orcale 触发器实现级联删除