在程序中定义一个悬浮窗,并在布局中加入一个surfaceView时,
在屏幕中会生成一个盲点,悬浮窗的其他控件移到这个盲点时会被遮盖。如下图:(中间红色部分是一个surfaceview)
附代码:
XuanFuChuangActivity.java
- package com.felix.xuanfuchuang;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.WindowManager;
- import android.view.ViewDebug.FlagToString;
- import android.widget.Button;
- public class XuanFuChuangActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Intent it = new Intent(this, XuanFuChuangService.class);
- startService(it);
- }
- }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.felix.xuanfuchuang; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.WindowManager; import android.view.ViewDebug.FlagToString; import android.widget.Button; public class XuanFuChuangActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent it = new Intent(this, XuanFuChuangService.class); startService(it); } }
复制代码
XuanFuChuangService.java
1
- package com.felix.xuanfuchuang;
- import android.app.Service;
- import android.content.Intent;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.PixelFormat;
- import android.graphics.Rect;
- import android.os.IBinder;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.SurfaceHolder;
- import android.view.SurfaceHolder.Callback;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.View.OnTouchListener;
- import android.view.WindowManager;
- import android.view.WindowManager.LayoutParams;
- import android.widget.Button;
- import android.widget.TextView;
- public class XuanFuChuangService extends Service {
- private int statusBarHeight;
- private View view;
- private TextView tv;
- private Button btn;
- private SurfaceView sv;
- private boolean viewAdded = false;
- private WindowManager wm;
- private WindowManager.LayoutParams params;
- private int x,y;
- @Override
- public IBinder onBind(Intent it) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- view = LayoutInflater.from(this).inflate(R.layout.floating, null);
- tv = (TextView)view.findViewById(R.id.text_view);
- tv.bringToFront();
- btn = (Button)view.findViewById(R.id.floating_button_hide);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Log.v("floating window", "btn clicked");
- }
- });
- sv = (SurfaceView)view.findViewById(R.id.surface_view);
- sv.setMinimumWidth(100);
- sv.setMinimumHeight(200);
- sv.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- int eventAction = event.getAction();
- switch(eventAction)
- {
- case MotionEvent.ACTION_DOWN:
- x = (int)event.getX();
- y = (int)event.getY();
- break;
- }
- return true;
- }
- });
- sv.getHolder().addCallback(new Callback() {
- private DrawThread dt ;
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- dt.isRun = false;
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- dt = new DrawThread(holder);
- dt.isRun = true;
- dt.start();
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- // TODO Auto-generated method stub
- }
- class DrawThread extends Thread
- {
- private SurfaceHolder holder;
- private boolean isRun;
- public DrawThread(SurfaceHolder h)
- {
- holder = h;
- isRun = true;
- }
- @Override
- public void run()
- {
- int count = 0;
- while(isRun)
- {
- Canvas c = null;
- try
- {
- synchronized(holder)
- {
- count %= 10;
- c = holder.lockCanvas();
- c.drawColor(Color.RED);
- Paint p = new Paint();
- p.setColor(Color.CYAN);
- Log.v("floating window","x="+x+" y="+y);
- Rect r = new Rect(x,y,x+10+count,y+50);
- c.drawRect(r, p);
- count += 2;
- Thread.sleep(1000);
- }
- }catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }finally
- {
- if(c != null)
- {
- holder.unlockCanvasAndPost(c);
- }
- }
- }
- }
- }
- });
- wm = (WindowManager)this.getSystemService(WINDOW_SERVICE);
- params = new LayoutParams();
- params.width = LayoutParams.WRAP_CONTENT;
- params.height = LayoutParams.WRAP_CONTENT;
- params.type = LayoutParams.TYPE_SYSTEM_ALERT|LayoutParams.TYPE_SYSTEM_OVERLAY;
- params.flags = LayoutParams.FLAG_NOT_FOCUSABLE|LayoutParams.FLAG_NOT_TOUCH_MODAL;
- params.gravity= Gravity.LEFT|Gravity.TOP;
- view.setOnTouchListener(new OnTouchListener() {
- float[] tmp = new float[]{0f, 0f};
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // TODO Auto-generated method stub
- //params.gravity
- int eventAction = event.getAction();
- switch(eventAction)
- {
- case MotionEvent.ACTION_DOWN:
- tmp[0] = event.getX();
- tmp[1] = event.getY();
- break;
- case MotionEvent.ACTION_MOVE:
- refreshView((int)(event.getRawX() - tmp[0]),(int)(event.getRawY() - tmp[1]));
- break;
- }
- return true;
- }
- });
- }
- protected void refreshView(int x, int y) {
- // TODO Auto-generated method stub
- if(statusBarHeight == 0)
- {
- View rootView = view.getRootView();
- Rect r = new Rect();
- rootView.getWindowVisibleDisplayFrame(r);
- statusBarHeight = r.top;
- }
- tv.setText("x="+x+" y="+y);
- params.x = x;
- params.y = y-statusBarHeight;
- refresh();
- }
- private void refresh() {
- // TODO Auto-generated method stub
- if(viewAdded)
- {
- wm.updateViewLayout(view, params);
- }
- else
- {
- wm.addView(view, params);
- viewAdded = true;
- }
- }
- private void removeView()
- {
- if(viewAdded)
- {
- wm.removeView(view);
- viewAdded = false;
- }
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.v("floating window","on destroy");
- removeView();
- }
- @Override
- public void onStart(Intent intent, int startId) {
- super.onStart(intent, startId);
- Log.v("floating window", "onstart");
- refresh();
- }
- }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210package com.felix.xuanfuchuang; import android.app.Service; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.IBinder; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.TextView; public class XuanFuChuangService extends Service { private int statusBarHeight; private View view; private TextView tv; private Button btn; private SurfaceView sv; private boolean viewAdded = false; private WindowManager wm; private WindowManager.LayoutParams params; private int x,y; @Override public IBinder onBind(Intent it) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); view = LayoutInflater.from(this).inflate(R.layout.floating, null); tv = (TextView)view.findViewById(R.id.text_view); tv.bringToFront(); btn = (Button)view.findViewById(R.id.floating_button_hide); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Log.v("floating window", "btn clicked"); } }); sv = (SurfaceView)view.findViewById(R.id.surface_view); sv.setMinimumWidth(100); sv.setMinimumHeight(200); sv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int eventAction = event.getAction(); switch(eventAction) { case MotionEvent.ACTION_DOWN: x = (int)event.getX(); y = (int)event.getY(); break; } return true; } }); sv.getHolder().addCallback(new Callback() { private DrawThread dt ; @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub dt.isRun = false; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub dt = new DrawThread(holder); dt.isRun = true; dt.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } class DrawThread extends Thread { private SurfaceHolder holder; private boolean isRun; public DrawThread(SurfaceHolder h) { holder = h; isRun = true; } @Override public void run() { int count = 0; while(isRun) { Canvas c = null; try { synchronized(holder) { count %= 10; c = holder.lockCanvas(); c.drawColor(Color.RED); Paint p = new Paint(); p.setColor(Color.CYAN); Log.v("floating window","x="+x+" y="+y); Rect r = new Rect(x,y,x+10+count,y+50); c.drawRect(r, p); count += 2; Thread.sleep(1000); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { if(c != null) { holder.unlockCanvasAndPost(c); } } } } } }); wm = (WindowManager)this.getSystemService(WINDOW_SERVICE); params = new LayoutParams(); params.width = LayoutParams.WRAP_CONTENT; params.height = LayoutParams.WRAP_CONTENT; params.type = LayoutParams.TYPE_SYSTEM_ALERT|LayoutParams.TYPE_SYSTEM_OVERLAY; params.flags = LayoutParams.FLAG_NOT_FOCUSABLE|LayoutParams.FLAG_NOT_TOUCH_MODAL; params.gravity= Gravity.LEFT|Gravity.TOP; view.setOnTouchListener(new OnTouchListener() { float[] tmp = new float[]{0f, 0f}; @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub //params.gravity int eventAction = event.getAction(); switch(eventAction) { case MotionEvent.ACTION_DOWN: tmp[0] = event.getX(); tmp[1] = event.getY(); break; case MotionEvent.ACTION_MOVE: refreshView((int)(event.getRawX() - tmp[0]),(int)(event.getRawY() - tmp[1])); break; } return true; } }); } protected void refreshView(int x, int y) { // TODO Auto-generated method stub if(statusBarHeight == 0) { View rootView = view.getRootView(); Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); statusBarHeight = r.top; } tv.setText("x="+x+" y="+y); params.x = x; params.y = y-statusBarHeight; refresh(); } private void refresh() { // TODO Auto-generated method stub if(viewAdded) { wm.updateViewLayout(view, params); } else { wm.addView(view, params); viewAdded = true; } } private void removeView() { if(viewAdded) { wm.removeView(view); viewAdded = false; } } @Override public void onDestroy() { super.onDestroy(); Log.v("floating window","on destroy"); removeView(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.v("floating window", "onstart"); refresh(); } }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:background="#00ff00"
- >
- <LinearLayout android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:background="#0000ff"
- >
- <TextView android:id="@+id/text_view"
- android:layout_width="80px"
- android:layout_height="20px"
- android:text="null"
- android:editable="false"/>
- <SurfaceView android:id="@+id/surface_view"
- android:layout_width="150px"
- android:layout_height="100px"
- />
- </LinearLayout>
- <Button android:id="@+id/floating_button_hide"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="hide"
- />
- </LinearLayout>
最后
以上就是兴奋台灯最近收集整理的关于android 悬浮窗使用surfaceview的问题的全部内容,更多相关android内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复