首页 > 代码库 > android桌面小火箭升空动画
android桌面小火箭升空动画
1 public class MainActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 } 7 /** 开启小火箭 */ 8 public void start(View view) { 9 startService(new Intent(this, RocketService.class));10 finish();11 }12 /** 取消小火箭 */13 public void cancel(View view) {14 stopService(new Intent(this, RocketService.class));15 }16 17 }
1 import android.content.Context; 2 import android.content.res.Resources; 3 import android.util.DisplayMetrics; 4 5 //工具类 6 public class DenstyUtil { 7 8 /** 9 * This method converts dp unit to equivalent pixels, depending on device10 * density.11 * 12 * @param dp13 * A value in dp (density independent pixels) unit. Which we need14 * to convert into pixels15 * @param context16 * Context to get resources and device specific display metrics17 * @return A float value to represent px equivalent to dp depending on18 * device density19 */20 public static float convertDpToPixel(float dp, Context context) {21 Resources resources = context.getResources();22 DisplayMetrics metrics = resources.getDisplayMetrics();23 float px = dp * (metrics.densityDpi / 160f);24 return px;25 }26 27 /**28 * This method converts device specific pixels to density independent29 * pixels.30 * 31 * @param px32 * A value in px (pixels) unit. Which we need to convert into db33 * @param context34 * Context to get resources and device specific display metrics35 * @return A float value to represent dp equivalent to px value36 */37 public static float convertPixelsToDp(float px, Context context) {38 Resources resources = context.getResources();39 DisplayMetrics metrics = resources.getDisplayMetrics();40 float dp = px / (metrics.densityDpi / 160f);41 return dp;42 }43 44 }
1 import java.util.List; 2 import android.app.ActivityManager; 3 import android.app.ActivityManager.RunningServiceInfo; 4 import android.content.Context; 5 6 // 工具类 7 public class ServiceUtil { 8 9 /**10 * 判断当前该服务是否在运行11 * 12 * @param context13 * @param cls14 * @return15 */16 public static boolean isServiceRunning(Context context, Class<?> cls) {17 ActivityManager activityManager = (ActivityManager) context18 .getSystemService(Context.ACTIVITY_SERVICE);19 List<RunningServiceInfo> runningServices = activityManager20 .getRunningServices(1024);21 for (RunningServiceInfo service : runningServices) {22 if (cls.getName().equals(service.service.getClassName())) {23 return true;24 }25 }26 return false;27 }28 }
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Timer; 4 import java.util.TimerTask; 5 import android.app.ActivityManager; 6 import android.app.ActivityManager.RunningTaskInfo; 7 import android.app.Service; 8 import android.content.Context; 9 import android.content.Intent; 10 import android.content.pm.PackageManager; 11 import android.content.pm.ResolveInfo; 12 import android.graphics.PixelFormat; 13 import android.graphics.drawable.AnimationDrawable; 14 import android.os.Handler; 15 import android.os.IBinder; 16 import android.os.Vibrator; 17 import android.util.DisplayMetrics; 18 import android.util.Log; 19 import android.view.Gravity; 20 import android.view.MotionEvent; 21 import android.view.View; 22 import android.view.View.OnTouchListener; 23 import android.view.WindowManager; 24 import android.view.WindowManager.LayoutParams; 25 import android.widget.ImageView; 26 import com.charon.rocketfly.R; 27 import com.charon.rocketfly.RocketActivity; 28 import com.charon.rocketfly.util.DenstyUtil; 29 30 public class RocketService extends Service { 31 protected static final String TAG = "RocketService"; 32 private WindowManager mWindowManager; 33 private int mWindowWidth; 34 private int mWindowHeight; 35 private static View icon; 36 private static View rocket_launcher; 37 38 private static AnimationDrawable mFireAnimationDrawable; 39 private static AnimationDrawable mLauncherAnimationDrawable; 40 41 private WindowManager.LayoutParams iconParams; 42 private WindowManager.LayoutParams launcherParams; 43 44 private static int mLauncherHeight; 45 private static int mLauncherWidth; 46 47 private Vibrator mVibrator; // 震动 48 49 private Timer timer; 50 51 private Handler mHandler = new Handler(); 52 53 @Override 54 public IBinder onBind(Intent intent) { 55 return null; 56 } 57 58 @Override 59 public void onCreate() { 60 super.onCreate(); 61 // 62 mWindowManager = (WindowManager) this.getApplicationContext() 63 .getSystemService(Context.WINDOW_SERVICE); 64 // 获取手机屏幕的分辨率和密度 (Pixels:像素) 65 DisplayMetrics displayMetrics = new DisplayMetrics(); 66 mWindowManager.getDefaultDisplay().getMetrics(displayMetrics); 67 mWindowWidth = displayMetrics.widthPixels; 68 mWindowHeight = displayMetrics.heightPixels; 69 70 // 取得震动服务的句柄 71 mVibrator = (Vibrator) this.getApplicationContext().getSystemService( 72 Context.VIBRATOR_SERVICE); 73 } 74 75 @Override 76 public int onStartCommand(Intent intent, int flags, int startId) { 77 Log.e(TAG, "on start command create icon"); 78 createIcon(); 79 if (timer == null) { 80 timer = new Timer(); 81 timer.scheduleAtFixedRate(new RefreshTask(), 0, 500); 82 } 83 return super.onStartCommand(intent, flags, startId); 84 } 85 86 @Override 87 public void onDestroy() { 88 removeIcon(); 89 removeLauncher(); 90 timer.cancel(); 91 timer = null; 92 super.onDestroy(); 93 } 94 95 /** 96 * 创建桌面悬浮窗,一旦点击就变成小火箭 97 */ 98 public void createIcon() { 99 removeIcon();100 iconParams = new LayoutParams();101 icon = new ImageView(this.getApplicationContext());102 Log.e(TAG, "creat icon is not null");103 icon.setBackgroundResource(R.drawable.floating_desktop_tips_rocket_bg);104 105 icon.setOnTouchListener(new OnTouchListener() {106 float startX = 0;107 float startY = 0;108 109 @Override110 public boolean onTouch(View v, MotionEvent event) {111 switch (event.getAction()) {112 case MotionEvent.ACTION_DOWN:113 // 手指一旦点击了后,就要去创建小火箭,和下面的发射台,并且给小火箭播放动画114 startX = event.getX();115 startY = event.getY();116 117 // 小火箭升空图片118 icon.setBackgroundResource(R.drawable.rocket_fire);119 120 mFireAnimationDrawable = (AnimationDrawable) icon121 .getBackground();122 mFireAnimationDrawable.start();123 iconParams.width = WindowManager.LayoutParams.WRAP_CONTENT;124 iconParams.height = WindowManager.LayoutParams.WRAP_CONTENT;125 iconParams.y = iconParams.y - iconParams.height126 - icon.getHeight() * 2;127 128 mWindowManager.updateViewLayout(icon, iconParams);129 130 createLauncher();131 132 break;133 case MotionEvent.ACTION_MOVE:134 135 Log.d(TAG, "action move change the location");136 float newX = event.getRawX();137 Log.e(TAG, "iconHeight:" + icon.getHeight() + ":::"138 + iconParams.height);139 float newY = event.getRawY() - icon.getHeight()140 - iconParams.height;141 mWindowManager.updateViewLayout(icon, iconParams);142 143 iconParams.x = (int) (newX - startX);144 iconParams.y = (int) (newY - startY);145 146 // 小火箭去移动位置147 isReadyToLaunch(event.getRawX(), event.getRawY());148 149 break;150 151 case MotionEvent.ACTION_UP:152 // 手指抬起的时候,要么小火箭去发射,要么就是恢复到原来的提示图标那样153 Log.d(TAG, "action up");154 if (isReadyToLaunch((int) event.getRawX(),155 (int) event.getRawY())) {156 Intent intent = new Intent(RocketService.this,157 RocketActivity.class);158 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);159 startActivity(intent);160 removeIcon();161 removeLauncher();162 } else {163 Log.e(TAG, "action up create icon.");164 createIcon();165 icon.setBackgroundResource(R.drawable.floating_desktop_tips_rocket_bg);166 }167 168 break;169 }170 171 return true;172 }173 });174 175 iconParams.gravity = Gravity.LEFT | Gravity.TOP;176 iconParams.x = mWindowWidth;177 iconParams.y = mWindowHeight / 2;178 iconParams.height = WindowManager.LayoutParams.WRAP_CONTENT;179 iconParams.width = WindowManager.LayoutParams.WRAP_CONTENT;180 iconParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE181 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;182 iconParams.format = PixelFormat.TRANSLUCENT;183 iconParams.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;184 185 mWindowManager.addView(icon, iconParams);186 }187 188 private void removeIcon() {189 if (icon != null && icon.getParent() != null) {190 mWindowManager.removeView(icon);191 icon = null;192 }193 removeLauncher();194 }195 196 /**197 * 创建桌面发射台198 */199 private void createLauncher() {200 removeLauncher();201 202 launcherParams = new LayoutParams();203 rocket_launcher = new ImageView(this.getApplicationContext());204 changelauncherState(false);205 206 launcherParams.height = (int) DenstyUtil.convertDpToPixel(80,207 this.getApplicationContext());208 launcherParams.width = (int) DenstyUtil.convertDpToPixel(200,209 this.getApplicationContext());210 mLauncherHeight = launcherParams.height;211 mLauncherWidth = launcherParams.width;212 213 // 这个x、y是起始添加的位置214 launcherParams.x = mWindowWidth / 2 - mLauncherWidth / 2;215 launcherParams.y = mWindowHeight - mLauncherHeight;216 launcherParams.gravity = Gravity.LEFT | Gravity.TOP;217 218 Log.d(TAG, "create launcher. width::" + rocket_launcher.getWidth());219 launcherParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE220 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;221 launcherParams.format = PixelFormat.TRANSLUCENT;222 launcherParams.type = WindowManager.LayoutParams.TYPE_TOAST;223 224 mWindowManager.addView(rocket_launcher, launcherParams);225 }226 227 private void removeLauncher() {228 if (rocket_launcher != null && rocket_launcher.getParent() != null) {229 mWindowManager.removeView(rocket_launcher);230 }231 }232 233 /**234 * 更改发射台的状态235 * 236 * @param isReadFly237 * 是否可以进入发射状态238 */239 private void changelauncherState(boolean isReadFly) {240 if (rocket_launcher == null) {241 return;242 }243 244 if (isReadFly) {245 rocket_launcher.setBackgroundResource(R.drawable.desktop_bg_tips_3);246 if (mLauncherAnimationDrawable != null) {247 mLauncherAnimationDrawable.stop();248 }249 } else {250 rocket_launcher.setBackgroundResource(R.drawable.status_tip);251 252 // 创建发射台253 mLauncherAnimationDrawable = (AnimationDrawable) rocket_launcher254 .getBackground();255 if (!mLauncherAnimationDrawable.isRunning()) {256 mLauncherAnimationDrawable.start();257 }258 }259 }260 261 /**262 * 判断是否可以进行发射263 * 264 * @param x265 * 当前火箭的距x轴的距离266 * @param y267 * 当前火箭的距y轴的距离268 * @return true为进入发射状态,反之为false269 */270 private boolean isReadyToLaunch(float x, float y) {271 if ((x > launcherParams.x && x < launcherParams.x272 + launcherParams.width)273 && (y > launcherParams.y)) {274 changelauncherState(true);275 Log.d(TAG, "is ready to launch.. true");276 mVibrator.vibrate(100);277 return true;278 }279 changelauncherState(false);280 return false;281 }282 283 /**284 * 判断当前界面是否是桌面285 * getRunningTasks(1):返回的个数。当前 运行的那个task。286 * get(0):从task中获取到最顶层的activity,这个activity就是当前显示给用户的那个activity了287 */288 private boolean isHome() {289 ActivityManager mActivityManager = (ActivityManager) getSystemService(290 Context.ACTIVITY_SERVICE);291 List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);292 return getHomes().contains(rti.get(0).topActivity.getPackageName());293 }294 295 /**296 * 获得属于桌面的应用的应用包名称297 * 298 * @return 返回包含所有包名的字符串列表299 */300 private List<String> getHomes() {301 List<String> names = new ArrayList<String>();302 PackageManager packageManager = this.getPackageManager();303 Intent intent = new Intent(Intent.ACTION_MAIN);304 intent.addCategory(Intent.CATEGORY_HOME);305 // 通过查询,获得所有ResolveInfo对象306 List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(307 intent, PackageManager.MATCH_DEFAULT_ONLY);308 for (ResolveInfo ri : resolveInfo) {309 names.add(ri.activityInfo.packageName);310 }311 return names;312 }313 314 private class RefreshTask extends TimerTask {315 316 @Override317 public void run() {318 // 当前界面是桌面,且没有悬浮窗显示,则创建悬浮窗。319 if (isHome()) {320 mHandler.post(new Runnable() {321 @Override322 public void run() {323 if (icon == null) {324 Log.e(TAG,325 "refresh task create icon, and the icon is null");326 createIcon();327 }328 }329 });330 331 }332 // 当前界面不是桌面,且有悬浮窗显示,则移除悬浮窗。333 else if (!isHome()) {334 mHandler.post(new Runnable() {335 @Override336 public void run() {337 removeIcon();338 }339 });340 }341 }342 343 }344 345 }
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:background="@android:color/transparent" > 5 6 <ImageView 7 android:id="@+id/iv_rocket" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content"10 android:layout_alignParentBottom="true"11 android:layout_centerHorizontal="true"12 android:src="@drawable/rocket_fire" />13 14 <RelativeLayout15 android:id="@+id/rl_cloud"16 android:layout_width="wrap_content"17 android:layout_height="wrap_content" >18 19 <ImageView20 android:id="@+id/iv_cloud"21 android:layout_width="match_parent"22 android:layout_height="wrap_content"23 android:layout_alignParentBottom="true"24 android:background="@drawable/desktop_smoke_m"25 android:visibility="gone" />26 27 <ImageView28 android:id="@+id/iv_cloud_line"29 android:layout_width="wrap_content"30 android:layout_height="wrap_content"31 android:layout_above="@id/iv_cloud"32 android:layout_centerHorizontal="true"33 android:background="@drawable/desktop_smoke_t"34 android:visibility="gone" />35 </RelativeLayout>36 37 </RelativeLayout>
1 import android.app.Activity; 2 import android.content.Intent; 3 import android.graphics.drawable.AnimationDrawable; 4 import android.media.MediaPlayer; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.view.animation.AccelerateDecelerateInterpolator; 9 import android.view.animation.AlphaAnimation; 10 import android.view.animation.Animation; 11 import android.view.animation.Animation.AnimationListener; 12 import android.view.animation.AnimationUtils; 13 import android.widget.ImageView; 14 import android.widget.RelativeLayout; 15 16 import com.charon.rocketfly.setvice.RocketService; 17 import com.charon.rocketfly.util.ServiceUtil; 18 19 /** 20 * 小火箭升空界面 21 * @author dr 22 */ 23 public class RocketActivity extends Activity { 25 protected static final String TAG = "RocketActivity"; 27 private ImageView iv_rocket; 28 private ImageView iv_cloud; 29 private ImageView iv_cloud_line; 30 private RelativeLayout rl_cloud; 31 32 private AnimationDrawable fireAnimationDrawable; 33 34 @Override 35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 setContentView(R.layout.activity_rocket); 38 findView(); 39 initView(); 40 } 41 42 private void findView() { 43 iv_rocket = (ImageView) findViewById(R.id.iv_rocket); 44 iv_cloud = (ImageView) findViewById(R.id.iv_cloud); 45 iv_cloud_line = (ImageView) findViewById(R.id.iv_cloud_line); 46 rl_cloud = (RelativeLayout) findViewById(R.id.rl_cloud); 47 } 48 49 private void initView() { 50 iv_rocket.setPressed(true); 51 iv_rocket.setFocusable(true); 52 iv_rocket.setVisibility(View.VISIBLE); 53 } 54 55 @Override 56 protected void onStart() { 57 super.onStart(); 58 iv_rocket.setBackgroundResource(R.drawable.rocket_fire); 59 fireAnimationDrawable = (AnimationDrawable) iv_rocket.getBackground(); 60 fireAnimationDrawable.start(); 61 62 fly(); 63 } 64 65 /** 66 * 火箭飞起来的动画,同时下方播放冒烟的动画 67 */ 68 private void fly() { 69 Log.e(TAG, "fly...."); 70 Animation animation = AnimationUtils.loadAnimation( 71 this.getApplicationContext(), R.anim.rocket_up); 72 animation.setFillAfter(true); 73 74 animation.setAnimationListener(new AnimationListener() { 75 76 @Override 77 public void onAnimationStart(Animation animation) { 78 // 开始发射的时候去博凡动画 79 MediaPlayer player = MediaPlayer.create(RocketActivity.this, 80 R.raw.rocket); 81 player.setLooping(false); 82 player.setVolume(1.0f, 1.0f); 83 player.start(); 84 85 AlphaAnimation cloudAppearAnimation = new AlphaAnimation(0.1f, 86 1.0f); 87 cloudAppearAnimation.setDuration(500); 88 89 Animation appearAnimation = new AlphaAnimation(0.0f, 1.0f); 90 appearAnimation.setDuration(500); 91 appearAnimation.setStartOffset(250); 92 93 iv_cloud.startAnimation(cloudAppearAnimation); 94 iv_cloud_line.startAnimation(appearAnimation); 95 } 96 97 @Override 98 public void onAnimationRepeat(Animation animation) { 99 }100 101 @Override102 public void onAnimationEnd(Animation animation) {103 // 火箭播放完成后就去把云彩都消失104 removeClound();105 if (!ServiceUtil.isServiceRunning(RocketActivity.this,106 RocketService.class)) {107 startService(new Intent(RocketActivity.this108 .getApplicationContext(), RocketService.class));109 }110 }111 });112 113 iv_rocket.startAnimation(animation);114 115 createClound();116 }117 118 private void createClound() {119 iv_cloud.setVisibility(View.VISIBLE);120 iv_cloud_line.setVisibility(View.VISIBLE);121 }122 123 private void removeClound() {124 AlphaAnimation disappearAnimation = new AlphaAnimation(1.0f, 0.0f);125 disappearAnimation.setDuration(1000);126 disappearAnimation.setFillAfter(true);127 disappearAnimation128 .setInterpolator(new AccelerateDecelerateInterpolator());129 130 disappearAnimation.setAnimationListener(new AnimationListener() {131 132 @Override133 public void onAnimationStart(Animation animation) {135 }136 137 @Override138 public void onAnimationRepeat(Animation animation) {140 }141 142 @Override143 public void onAnimationEnd(Animation animation) {144 iv_rocket.setVisibility(View.GONE);145 iv_cloud.setVisibility(View.GONE);146 iv_cloud_line.setVisibility(View.GONE);147 148 finish();149 }150 });151 rl_cloud.startAnimation(disappearAnimation);152 }153 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.charon.rocketfly" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="19" />10 11 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />12 <!-- 震动 -->13 <uses-permission android:name="android.permission.VIBRATE" />14 <uses-permission android:name="android.permission.GET_TASKS"/>15 16 <application17 android:allowBackup="true"18 android:icon="@drawable/ic_launcher"19 android:label="@string/app_name"20 android:theme="@style/AppTheme" >21 <activity22 android:name="com.charon.rocketfly.MainActivity"23 android:label="@string/app_name" >24 <intent-filter>25 <action android:name="android.intent.action.MAIN" />26 <category android:name="android.intent.category.LAUNCHER" />27 </intent-filter>28 </activity>29 30 <activity31 android:name="com.charon.rocketfly.RocketActivity"32 android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />33 <service android:name="com.charon.rocketfly.setvice.RocketService" />34 35 </application>36 37 </manifest>
DEMO下载地址:http://download.csdn.net/detail/androidsj/7952437
android桌面小火箭升空动画
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。