zoukankan      html  css  js  c++  java
  • 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 device
    10      * density.
    11      * 
    12      * @param dp
    13      *            A value in dp (density independent pixels) unit. Which we need
    14      *            to convert into pixels
    15      * @param context
    16      *            Context to get resources and device specific display metrics
    17      * @return A float value to represent px equivalent to dp depending on
    18      *         device density
    19      */
    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 independent
    29      * pixels.
    30      * 
    31      * @param px
    32      *            A value in px (pixels) unit. Which we need to convert into db
    33      * @param context
    34      *            Context to get resources and device specific display metrics
    35      * @return A float value to represent dp equivalent to px value
    36      */
    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 context
    13      * @param cls
    14      * @return
    15      */
    16     public static boolean isServiceRunning(Context context, Class<?> cls) {
    17         ActivityManager activityManager = (ActivityManager) context
    18                 .getSystemService(Context.ACTIVITY_SERVICE);
    19         List<RunningServiceInfo> runningServices = activityManager
    20                 .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             @Override
    110             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) icon
    121                             .getBackground();
    122                     mFireAnimationDrawable.start();
    123                     iconParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
    124                     iconParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
    125                     iconParams.y = iconParams.y - iconParams.height
    126                             - 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_FOCUSABLE
    181                 | 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. :" + rocket_launcher.getWidth());
    219         launcherParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    220                 | 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 isReadFly
    237      *            是否可以进入发射状态
    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_launcher
    254                     .getBackground();
    255             if (!mLauncherAnimationDrawable.isRunning()) {
    256                 mLauncherAnimationDrawable.start();
    257             }
    258         }
    259     }
    260 
    261     /**
    262      * 判断是否可以进行发射
    263      * 
    264      * @param x
    265      *            当前火箭的距x轴的距离
    266      * @param y
    267      *            当前火箭的距y轴的距离
    268      * @return true为进入发射状态,反之为false
    269      */
    270     private boolean isReadyToLaunch(float x, float y) {
    271         if ((x > launcherParams.x && x < launcherParams.x
    272                 + 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         @Override
    317         public void run() {
    318             // 当前界面是桌面,且没有悬浮窗显示,则创建悬浮窗。
    319             if (isHome()) {
    320                 mHandler.post(new Runnable() {
    321                     @Override
    322                     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                     @Override
    336                     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     <RelativeLayout
    15         android:id="@+id/rl_cloud"
    16         android:layout_width="wrap_content"
    17         android:layout_height="wrap_content" >
    18 
    19         <ImageView
    20             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         <ImageView
    28             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             @Override
    102             public void onAnimationEnd(Animation animation) {
    103                 // 火箭播放完成后就去把云彩都消失
    104                 removeClound();
    105                 if (!ServiceUtil.isServiceRunning(RocketActivity.this,
    106                         RocketService.class)) {
    107                     startService(new Intent(RocketActivity.this
    108                             .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         disappearAnimation
    128                 .setInterpolator(new AccelerateDecelerateInterpolator());
    129 
    130         disappearAnimation.setAnimationListener(new AnimationListener() {
    131 
    132             @Override
    133             public void onAnimationStart(Animation animation) {
    135             }
    136 
    137             @Override
    138             public void onAnimationRepeat(Animation animation) {
    140             }
    141 
    142             @Override
    143             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     <application
    17         android:allowBackup="true"
    18         android:icon="@drawable/ic_launcher"
    19         android:label="@string/app_name"
    20         android:theme="@style/AppTheme" >
    21         <activity
    22             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         <activity
    31         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

  • 相关阅读:
    March 13 2017 Week 11 Monday
    March 12 2017 Week 11 Sunday
    March 11 2017 Week 10 Saturday
    March 10 2017 Week 10 Friday
    Mrach 9 2017 Week 10 Thursday
    March 8 2017 Week 10 Wednesday
    玩转Sketch,不容错过的5大实用插件推荐
    网页设计排版中哪些元素最重要?
    5 个关键点!优化你的 UI 原型设计
    如何制作一个完美的错误提示信息
  • 原文地址:https://www.cnblogs.com/androidsj/p/3984562.html
Copyright © 2011-2022 走看看