[Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
来源:互联网 发布:mac os sierra beta4 编辑:程序博客网 时间:2024/03/29 14:36
转载请注明出处:http://blog.csdn.net/ruils/article/details/16922557
最近有人问我金山清理大师桌面上的一键加速的动画是如何实现的,我下了个金山清理大师装在手机上,体现了一把,感觉还不错,所以就花了点时间研究了一下。
先看看效果:
点一下,
第一感觉就是在Window中增加View的做法来实现的,像360卫士的悬浮窗那样,而且这个动画效果会随着一键加速图标在桌面上的位置改变而改变,放在什么地方就从什么地方开始做动画,放在左边屏幕,就会向右边做动画,放在右边屏幕会向左边做动画,在自己的代码中怎么才能知道自己的图标所在屏幕的位置呢,百思不得其解,后来看了下Log,才发现其中的奥秘
Log:
I/ActivityManager(595): START u0 {act=android.intent.action.MAIN flg=0x10000000 cmp=com.cleanmaster.mguard_cn/com.cleanmaster.processcleaner.ProcessCleanerActivity bnds=[216,385][376,585]} from pid 866
从log中可以看出,点击一键加速的图标,实现上是启动了一个activity,而且还带有参数:bnds=[216,385][376,585],我去找了下Lanucher中的代码,
packages/apps/Launcher2/src/com/android/launcher2/
Launcher.java
2001 Object tag = v.getTag();2002 if (tag instanceof ShortcutInfo) {2003 // Open shortcut2004 final Intent intent = ((ShortcutInfo) tag).intent;2005 int[] pos = new int[2];2006 v.getLocationOnScreen(pos);2007 intent.setSourceBounds(new Rect(pos[0], pos[1],2008 pos[0] + v.getWidth(), pos[1] + v.getHeight()));2009 2010 boolean success = startActivitySafely(v, intent, tag);2011 2012 if (success && v instanceof BubbleTextView) {2013 mWaitingForResume = (BubbleTextView) v;2014 mWaitingForResume.setStayPressed(true);2015 }2016 } else if (tag instanceof FolderInfo) {
只有在点击一个快捷方式的时候,才会有附带坐标信息,原来这个一键加速是个快捷方式!现在明白了,点击一个快捷方式图标的时候,Lanucher会把此快捷方式的矩形的坐标放在Intent中传给所启动的activity。
intent.setSourceBounds既然知道这个坐标是怎么放的了,那取出来就简单了:
intent.getSourceBounds();
那接下来就一步一步实现这个动画
程序中用到的图片资源,我是从金山清理大师的APK中拿出来的,仅供学习参考之用!
1.首先要添加一个快捷方式到桌面
请参考我写的另外一篇博客:
[Android开发实战]添加快捷方式到桌面的两种方式
2.创建这个快捷方式启动的Activity.
这个activity得是透明的,我们创建一个Style
<style name="Transparent"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowNoTitle">true</item> </style>然后把这个Style应用到这个Activity上:
<activity android:name="com.cleanmanager.AnimationActivity" android:theme="@style/Transparent" > <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity>
注意给Activity加上<action android:name="android.intent.action.MAIN" />,因为这个Activity要从别的程序(Lanucher)中启动,所以这个Activity要能够做为一个启动的入口。
3. 在onCreate方法中,把动画所需要的布局文件显示在快捷方式所在的位置:
// 取得Lanucher传过来的所点击的快捷方式的矩形坐标。rect = intent.getSourceBounds();if (rect == null) {finish();return;}Log.d(TAG, rect.toShortString());mRelativeLayout = (RelativeLayout) findViewById(R.id.framelayout);mShortcut = (RelativeLayout) findViewById(R.id.shortcut);backImageView = (ImageView) findViewById(R.id.clean_back);roateImageView = (ImageView) findViewById(R.id.clean_rotate);// iconmageView = (ImageView) findViewById(R.id.clean_icon);textView = (TextView) findViewById(R.id.text);// DisplayMetrics dm = new DisplayMetrics();int width = getWindowManager().getDefaultDisplay().getWidth();int hight = getWindowManager().getDefaultDisplay().getHeight();Log.d(TAG, "width = " + width);Log.d(TAG, "hight = " + hight);RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mShortcut.getLayoutParams();layoutParams.topMargin = rect.top - (rect.bottom - rect.top) / 4;// 判断快捷方式在屏幕的哪一边,如果在左边,伸缩动画就会向右,如果在右边,伸缩动画向左。if (rect.left < width / 2) {direction = Direction.RIGHT;layoutParams.leftMargin = rect.left;} else {direction = Direction.LEFT;layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);layoutParams.rightMargin = width - rect.right;Log.d(TAG, "rightMargin = " + (width - rect.right));}mRelativeLayout.updateViewLayout(mShortcut, layoutParams);
快捷方式在屏幕左边的时候,就以左边为基准,快捷方式在屏幕右边的时候,就以右边为基准。
4.在onAttachedToWindow的时候,开始做旋转动画。 我们模拟金山清理大师正在清理,两秒钟之后,清理完了,开始做伸缩了
@Overridepublic void onAttachedToWindow() {super.onAttachedToWindow();// 旋转动画开始roateImageView.startAnimation(AnimationUtils.loadAnimation(this,R.anim.rotate_anim));// 假设垃圾清理了两秒钟,然后开如做伸缩动画。mHandler.sendEmptyMessageDelayed(MESSAGE_ROTATE_FINISHED, 2000);}
5.把旋转动画清除,然后开始拉伸updateWidth();
private Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case MESSAGE_ROTATE_FINISHED:mWidth = backImageView.getWidth();Log.d(TAG, "mWidth = " + mWidth);updateWidth();roateImageView.clearAnimation();roateImageView.setVisibility(View.INVISIBLE);break;case MESSAGE_UPDATE_WIDTH:updateWidth();break;default:break;}};
6.主要是通过不停的加大拉伸ImageView的宽度来实现拉伸动画。实现方式有很多种,可以自定义View,以后我会讲解如何自定义View,这里用的比较简单的方式实现的。
定义宽度到达以前宽度的2.5倍就线束动画,显示文字。
private void updateWidth() {// 宽度没有达到原来宽度的2.5度,继续做动画if (backImageView.getWidth() <= 2.5f * mWidth) {RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) backImageView.getLayoutParams();// 每次增加20的宽度,可以自行设置,和用户体验有关系,可自行调整layoutParams.width = backImageView.getWidth() + 20;mShortcut.updateViewLayout(backImageView, layoutParams);// 继续发更新消息。也可发送delay消息,和用户体验有关系,<span style="font-family: Arial, Helvetica, sans-serif;">可自行调整</span>mHandler.sendEmptyMessage(MESSAGE_UPDATE_WIDTH);} else {textView.setVisibility(View.VISIBLE);}};
看下效果:
点一下,
如果您喜欢这篇文章请点赞哦!
最后附上源码:
示例源码下载:http://download.csdn.net/detail/u012379847/6604299
Github地址:https://github.com/seashell752/CleanManager
- [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
- 猎豹清理大师波浪动画实现
- 仿猎豹清理大师波浪效果
- 创建快捷方式,一键清理快捷方式动画实现
- 【安卓笔记】仿猎豹清理大师波浪效果
- 一键清理大师 v5.6.0 安卓官方版
- Android 一键清理动画
- Diskpart命令破Windows7安装分区限制 来源:鲁大师下载 作者:一键清理
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- Android 一键清理、内存清理功能实现
- STL string
- zoj 3726 Pocket Cube(搜索)
- assert() 宏用法
- 0.driverbase-WDM和NT驱动
- java学习02-java基础知识、基本数据类型、运算符
- [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
- ACE_Task介绍(生产者/消费者)v3.0
- Dijkstra算法的个人理解
- Qt实现监听功能
- PokerGame
- WPF之布局控件
- ZOJ 3735 Josephina and RPG DP
- 编码问题
- Java 扑克游戏