android点击一个View进入一个应用,通常会有好几种动画,可以通过xml控制,也可以通过其内部提供的ActivityOptions类来控制。那么最近我们的载体(一个桌面)需要使用ActivityOptions.makeScaleUpAnimation的动画方式来进入一个应用,如果我们点击的是一个View v,那么正常的程序可以是酱紫:
Intent intent = 。。。 int[] pos = new int[2]; v.getLocationOnScreen(pos); intent.setSourceBounds(new Rect(pos[0], pos[1], pos[0] + v.getWidth(), pos[1] + v.getHeight())); ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); startActivity(intent, opts.toBundle());
上述效果就是点击一个图标(一个View)然后就进入到一个应用,中间的这个过程的动画效果就是伤处的opts控制滴,所以这种方法还是蛮简单的。那么问题来了,我点击的不是View怎么办?其实在桌面上的东西都是View,只不过我们的东西有点特别,opengl实现的,整体的内容是一个View,但是内部的空间没有一个是View的子类,那怎么办咯?例如amigo随变桌面里的创意时钟就是酱紫的,这整张图是一个View,内部的却不是View,又要求以点击的部位弹出应用,而不是以整个View弹出:
首先可以看到startActivity的第一个参数intent需要的内容,它就是需要4个int类型的值,而且分别是左上角的x坐标,左上角的y坐标,长度,宽度,好吧,这4个值都可以自己给值了。
再看到startActivity的第二个参数,一个Bundle对象,然后我们就进入到了ActivityOptions的源码看到toBundle方法,其实就是要传一些键值对:
public Bundle toBundle() { if (mAnimationType == ANIM_DEFAULT) { return null; } Bundle b = new Bundle(); if (mPackageName != null) { b.putString(KEY_PACKAGE_NAME, mPackageName); } b.putInt(KEY_ANIM_TYPE, mAnimationType); switch (mAnimationType) { case ANIM_CUSTOM: case ... ... } return b; }
再看makeScaleUpAnimation方法:
public static ActivityOptions makeScaleUpAnimation(View source, int startX, int startY, int width, int height) { ActivityOptions opts = new ActivityOptions(); opts.mPackageName = source.getContext().getPackageName(); opts.mAnimationType = ANIM_SCALE_UP; int[] pts = new int[2]; source.getLocationOnScreen(pts); opts.mStartX = pts[0] + startX; opts.mStartY = pts[1] + startY; opts.mWidth = width; opts.mHeight = height; return opts; }
可以看到这个View v的作用:1.获取当前应用的包名;2.获取这个view在屏幕上的左上角的坐标
结合上述两个源码,我们再次进入到toBundle,找到mAnimationType = ANIM_SCALE_UP需要的简直对:
b.putString(KEY_PACKAGE_NAME, mPackageName);//这个自己可以获取 b.putInt(KEY_ANIM_TYPE, mAnimationType);//ANIM_SCALE_UP常量 case ANIM_SCALE_UP: b.putInt(KEY_ANIM_START_X, mStartX); b.putInt(KEY_ANIM_START_Y, mStartY); b.putInt(KEY_ANIM_WIDTH, mWidth); b.putInt(KEY_ANIM_HEIGHT, mHeight); break;
好吧,由此可见需要的键值对一共有6个,另外需要的就是动画起始的坐标和初始框框的长度与宽度,其中长度和宽度我们可以自己给个固定的值,那么接下来就是mStartX和mStartY怎么获取?
其实它的源码写的很清楚了
int[] pts = new int[2]; View.getLocationOnScreen(pts);
通过上述方法可以得到一个View控制的左上角的坐标,但是这里的值并非我们想要的,我们需要点击例如上图的右下角那个图标呢? 不可能以整个View来弹出吧,所以还需要详细的点击的坐标。好在onTouchEvent(MotionEvent event)中的event可以得到当前点击的view中的坐标
event.getX()得到该点击在View中的坐标,又View在屏幕上的左上角的坐标是pts[0],那就是说 x=event.getX()+pts[0]就是我所点击的点在屏幕上的x坐标,由此y=event.getY()+pts[1]是我所点击的点在屏幕上的Y坐标,再给个定值长度和宽度=20,那就可以得到想要的Bundle了。
Bundle b = new Bundle(); b.putString(KEY_PACKAGE_NAME, packageName); b.putInt(KEY_ANIM_TYPE, ANIM_SCALE_UP); b.putInt(KEY_ANIM_START_X, x); b.putInt(KEY_ANIM_START_Y, y); b.putInt(KEY_ANIM_WIDTH, constVlaue); b.putInt(KEY_ANIM_HEIGHT, constVlaue);
Context.startActivity(intent, b);
好吧,虽然废话了一大把,但还是写出来作为一个记录,让自己以后养成查看源码的习惯,不要害怕,,,
相关推荐
在Android开发中,实现书籍的层叠翻页动画效果是一项常见的需求,特别是在设计电子阅读应用时,这样的平滑翻页体验能极大地提升用户的阅读感受。本文将深入探讨如何利用Android SDK中的工具和技术来创建这样的动画...
在Android开发中,应用启动动画(Splash Screen)是用户打开应用程序时首先看到的短暂界面,通常用来展示品牌标识、加载应用资源或者进行一些初始化操作。本文将深入探讨如何实现一个基于GIF的Android应用启动动画,...
"BaseAnimation数百种动画效果源码"这个资源包含了大量用于Android应用的动画效果实现,这对于开发者来说是一份宝贵的参考资料。下面我们将深入探讨Android动画体系以及这些源码可能涵盖的知识点。 1. **属性动画...
首先,Android中的动画分为两种类型:视图动画(View Animation)和属性动画(Property Animation)。视图动画主要用于2D效果,如平移、旋转、缩放和淡入淡出,而属性动画则更加强大,可以直接改变对象的属性并实时...
在本例中,通过属性动画的使用,我们成功地模拟了开关按钮点击打开的过程,增加了应用的视觉吸引力和用户体验。在实际开发中,开发者可以根据需求自由发挥,利用属性动画实现各种复杂的交互动画。
- 应用动画:调用start()方法启动动画。 - 监听动画事件:可以注册AnimationListener监听动画的开始、结束和重复事件,以便在合适的时候执行其他操作。 在MyLoginProject这个项目中,开发者已经实现了上述的一些...
6. **属性动画**:Android的属性动画系统允许在运行时改变View的属性,创建出流畅的过渡效果。 7. **MeasureSpec**:理解和熟练运用MeasureSpec是自定义View时的一大挑战。MeasureSpec包含尺寸的约束信息,用于在...
窗帘效果(Curtain Effect)通常是指一种屏幕从中间向两侧滑动打开或关闭的效果,常用于应用启动画面或者某些特定界面的过渡。在Android中实现这种效果,需要对View的移动进行精确控制,`Scroller`类就起到了关键...
"Android-Android实现垃圾桶开关动画"这一主题主要聚焦于如何在Android应用中创建一个具有开关功能的垃圾桶图标,并且伴随着生动的动画效果。以下是对这个主题的详细解释: 首先,Android中的动画大致可以分为两种...
在Android 5.0(Lollipop)系统中,侧滑菜单的打开与关闭动画更加优雅,增加了用户体验。本知识点将详细探讨如何在Android应用中实现这种仿Android 5.0的侧滑菜单按钮的动画效果。 首先,我们要理解`DrawerLayout`...
"android 饼状报表图 带打开动画和点击变大"这个主题着重于两个关键点:动画效果和交互性。 首先,让我们来详细探讨饼状图。饼状图通过将整体分割成多个扇形部分,每部分代表一个分类所占的比例,直观地呈现数据...
1. **Android Animation**: 打开和关闭书架的动画效果通常会用到Android系统的视图动画(View Animation)和属性动画(Property Animation)。视图动画主要包括Alpha(透明度)、Scale(缩放)、Translate(平移)和...
本文将深入探讨如何使用属性动画在Android中实现这种效果。 首先,我们要理解Android属性动画系统的基本概念。属性动画是Android 3.0(API Level 11)引入的一个功能,它允许开发者在没有实际改变视图属性的情况下...
通过实践和调试,开发者可以深入理解Android动画机制,提升应用的交互体验。 总之,`AnimationDemo`是一个全面的Android动画学习资源,涵盖了从基础到高级的各种动画技术。无论是初学者还是经验丰富的开发者,都...
当用户点击CheckBox时,我们需要检测到这一事件并触发动画。在自定义的CheckBox中,我们可以重写onTouchEvent方法来监听触摸事件,当检测到ACTION_DOWN和ACTION_UP时,分别开始和结束动画,并相应地改变CheckBox的...
这个例子展示了如何在Android应用中实现这种基本的动画效果。 首先,我们需要了解Android中的`Animation`类体系。Android提供了两种主要的动画类型:属性动画(Property Animation)和视图动画(View Animation)。...
这个库使得在Android应用中打开和显示PDF文件变得非常简便。下面我们将深入探讨如何使用这个库以及它背后的关键知识点。 1. **PDF(Portable Document Format)**:PDF是一种通用的文件格式,用于呈现文档,包括...
"Android应用源码之Android Layout UI 首页加载过渡动画,星期变化动画.zip"这个资源包提供了一个实际的Android应用实例,展示了如何通过源代码实现动态的布局UI和动画效果。以下是基于这个主题的详细知识点: 1. *...
Android提供了多种动画机制,包括属性动画(Property Animation)、视图动画(View Animation)以及过渡动画(Transition Animation)。属性动画是Android 3.0(API Level 11)引入的新特性,允许对对象的任意属性...
总的来说,这个压缩包提供了关于如何在Android应用中实现Material Design风格侧边栏动画效果的实践案例。对于初学者,这是一个很好的学习资源,可以从中了解如何结合使用布局、动画和事件处理来创建一个功能完备的侧...