[Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现

您所在的位置:网站首页 猎豹清理大师100元能用吗 [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现

[Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现

2024-07-13 12:38:40| 来源: 网络整理| 查看: 265

转载请注明出处: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 shortcut 2004 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

@android:color/transparent true true 然后把这个Style应用到这个Activity上:

注意给Activity加上,因为这个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的时候,开始做旋转动画。 我们模拟金山清理大师正在清理,两秒钟之后,清理完了,开始做伸缩了

@Override public 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()


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭