android 全局浮动球,Android浮动小球与开机自启动

看着手机上的360浮动小球,不评价其具体的功能与实用性,至少在UI设计与交互方面是个不小的创新。

188f02770dfccfd004859f8f95ce69bd.png

如图片左上角所示,球中还会显示当前手机的运行状况,向下拉动还会有弹射来达到加速、清理等目的。

那好,先来实现一个类似的小球(仅限于形状,功能你懂得)。

查阅了相关资料,整个界面除了小球以外,其他部分均是做透明处理。

1、由于用到了CompatModeWrapper,所以需要在AndroidManifest.xml中添加以下权限:

1

要想在应用中被启动为一个Activity或Service,需要注册,这里是Service:

1

2、界面透明化处理,整体代码如下:

1 packagecom.XXX.autostart;2

3 importandroid.view.View;4

5 importandroid.app.Service;6 importandroid.content.Intent;7 importandroid.graphics.PixelFormat;8 importandroid.os.Handler;9 importandroid.os.IBinder;10 importandroid.view.Gravity;11 importandroid.view.LayoutInflater;12 importandroid.view.MotionEvent;13 importandroid.view.WindowManager;14 importandroid.view.View.OnClickListener;15 importandroid.view.View.OnTouchListener;16 importandroid.view.WindowManager.LayoutParams;17 importandroid.widget.ImageButton;18 importandroid.widget.LinearLayout;19

20 public class Service1 extendsService21 {22 LinearLayout mFloatLayout;23 WindowManager.LayoutParams wmParams;24 WindowManager mWindowManager;25

26 ImageButton mFloatView;27

28 @Override29 public voidonCreate()30 {31 //TODO Auto-generated method stub

32 super.onCreate();33

34 createFloatView();35 }36

37 @Override38 publicIBinder onBind(Intent intent)39 {40 //TODO Auto-generated method stub

41 return null;42 }43

44 private voidcreateFloatView()45 {46 wmParams = newWindowManager.LayoutParams();47

48 mWindowManager =(WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);49

50 wmParams.type =LayoutParams.TYPE_PHONE;51 wmParams.format =PixelFormat.RGBA_8888;52

53 wmParams.flags =LayoutParams.FLAG_NOT_FOCUSABLE;54

55 wmParams.gravity = Gravity.LEFT |Gravity.TOP;56

57 wmParams.x = 0;58 wmParams.y = 0;59

60 wmParams.width =WindowManager.LayoutParams.WRAP_CONTENT;61 wmParams.height =WindowManager.LayoutParams.WRAP_CONTENT;62

63 LayoutInflater inflater =LayoutInflater.from(getApplication());64 mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null);65

66 mWindowManager.addView(mFloatLayout, wmParams);67

68 mFloatView =(ImageButton)mFloatLayout.findViewById(R.id.float_id);69

70 mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,71 View.MeasureSpec.UNSPECIFIED), View.MeasureSpec72 .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));73

74

75 mFloatView.setOnTouchListener(newOnTouchListener() {76 @Override77 public booleanonTouch(View v, MotionEvent event) {78 //TODO Auto-generated method stub

79

80 wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;81

82 wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;83

84 mWindowManager.updateViewLayout(mFloatLayout, wmParams);85 return false;86 }87 });88

89 mFloatView.setOnClickListener(newOnClickListener() {90

91 @Override92 public voidonClick(View v) {93 //TODO Auto-generated method stub

94 mFloatView.setVisibility(View.INVISIBLE);95

96 Handler handler = newHandler();97 handler.postDelayed(newRunnable() {98 public voidrun() {99 mFloatView.setVisibility(View.VISIBLE);100 }101 }, 3000);102

103 }104 });105 }106

107 @Override108 public voidonDestroy()109 {110 //TODO Auto-generated method stub

111 super.onDestroy();112 if(mFloatLayout != null)113 {114 mWindowManager.removeView(mFloatLayout);115 }116 }117

118 }

这里是利用ImageButton组件来实现小球,关键在于其显示的图片是圆形即可。

因此,要想将浮动窗口实现为其他形状,只需制作相应的图片赋给组件。

对于小球的功能,只是实现了在手机屏幕上随意拖动,单击消失三秒后重现。

3、浮动小球有了,怎么让它启动呢?注意上面实现的类Service1,继承的是Service。

在ManiActivity.java中,让其显现的方式很简单,代码如下:

1 finish();2 Intent intent = new Intent(getApplicationContext(), Service1.class);3 startService(intent);

注意,这里对于MainActivity类不需要做任何处理,新建工程时默认就好。当然,要实现其他功能例外。

代码finish();可加可不加,加上之后使得程序一运行就只剩下小球,原来的界面让其消失。

效果图如下,图形找的是红色小火焰。

6fe31076fd975724b5aed23233867284.png

4、到此,浮动小球就实现了,那怎么让它开机自启动呢?

其实也很简单,用到了BroadcastReceiver。

还是先添加权限:

1

另外,对于系统的广播消息,要想在开机等时刻能够捕获到,还需添加以下内容:

1

2

3

4

5

实现代码如下:

1 packagecom.XXX.autostart;2

3 importandroid.content.BroadcastReceiver;4 importandroid.content.Context;5 importandroid.content.Intent;6

7 public class BootBroadcastReceiver extendsBroadcastReceiver {8

9 static final String ACTION = "android.intent.action.BOOT_COMPLETED";10

11 @Override12 public voidonReceive(Context context, Intent intent) {13

14 if(intent.getAction().equals(ACTION)) {15 Intent intent1 = new Intent(context, Service1.class);16 intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);17 context.startService(intent1);18 }19 }20 }

将手机ReBoot,可以发现红色小球会自行启动,不过速度比较慢(和360安全卫士相比)。

原文:http://www.cnblogs.com/tgyf/p/4665401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值