版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本
在下給大家分享一下Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!懸浮窗是在系統(tǒng)上顯示的內(nèi)容,好像微信視頻聊天時(shí)的小窗口一樣,在退出軟件后依然存在的一個(gè)窗口,本博客以窗口中放一個(gè)button組件為例,簡單展示懸浮窗,其中包括了對(duì)Android6.0以下、Android6.0到Android8.0、Android8.0以上版本的處理,下面開始介紹實(shí)現(xiàn)方法:1、MainActivity中的代碼public
Button
mFloatingButton;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化view
initView();
}
//初始化view
private
void
initView()
{
mFloatingButton=(Button)
findViewById(R.id.floating_btn);
mFloatingButton.setOnClickListener(this);
}
public
void
startFloatingButtonService(View
view)
{
Log.e("測試流程",
"測試流程");
if
(FloatingService_Button.isStarted)
{
Log.e("測試流程2",
"測試流程2");
return;
}
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.M)
{//判斷系統(tǒng)版本
if
(!Settings.canDrawOverlays(this))
{
Toast.makeText(this,
"當(dāng)前無權(quán)限,請(qǐng)授權(quán)",
Toast.LENGTH_SHORT);
Log.e("測試流程3",
"測試流程3");
startActivityForResult(new
Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:"
+
getPackageName())),
0);
}
else
{
Log.e("測試流程4",
"測試流程4");
startService(new
Intent(MainActivity.this,
FloatingService_Button.class));
}
}
else
{
startService(new
Intent(MainActivity.this,
FloatingService_Button.class));
}
}
@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
if
(requestCode
==
0)
{
if
(!Settings.canDrawOverlays(this))
{
Log.e("測試流程5",
"測試流程5");
Toast.makeText(this,
"授權(quán)失敗",
Toast.LENGTH_SHORT).show();
}
else
{
Log.e("測試流程6",
"測試流程6");
Toast.makeText(this,
"授權(quán)成功",
Toast.LENGTH_SHORT).show();
startService(new
Intent(MainActivity.this,
FloatingService_Button.class));
}
}
}
@Override
public
void
onClick(View
v)
{
switch
(v.getId()){
case
R.id.floating_btn
:
startFloatingButtonService(v);
break;
}
}思路簡單解釋:點(diǎn)擊彈出懸浮窗按鈕時(shí),獲取版本并判斷“Build.VERSION.SDK_INT>=Build.VERSION_CODES.M”如果系統(tǒng)版本在6.0以下這不需要請(qǐng)求權(quán)限,如果系統(tǒng)版本在6.0以上需要進(jìn)行權(quán)限檢測以及請(qǐng)求,獲取權(quán)限后,彈出懸浮框2、activity_main.xml代碼<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.jack_lin.suspendwindow.MainActivity">
<Button
android:id="@+id/floating_btn"
android:text="@string/floating_btn"
/>
</LinearLayout>簡單解釋:xml中沒什么特別東西,線性布局中放一個(gè)按鈕3、FloatingService_Button的代碼public
static
boolean
isStarted
=
false;
private
WindowManager
windowManager;
private
WindowManager.LayoutParams
layoutParams;
private
Button
button;
@Override
public
void
onCreate()
{
super.onCreate();
Log.e("進(jìn)入服務(wù)1",
"進(jìn)入服務(wù)1");
isStarted
=
true;
windowManager
=
(WindowManager)
getSystemService(WINDOW_SERVICE);
layoutParams
=
new
WindowManager.LayoutParams();
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.O)
{
layoutParams.type
=
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}
else
{
layoutParams.type
=
WindowManager.LayoutParams.TYPE_PHONE;
}
layoutParams.format
=
PixelFormat.RGBA_8888;
layoutParams.gravity
=
Gravity.LEFT
|
Gravity.TOP;
layoutParams.flags
=
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.width
=
500;
layoutParams.height
=
100;
layoutParams.x
=
300;
layoutParams.y
=
300;
}
@Nullable
@Override
public
IBinder
onBind(Intent
intent)
{
Log.e("進(jìn)入服務(wù)2",
"進(jìn)入服務(wù)2");
return
null;
}
@Override
public
int
onStartCommand(Intent
intent,
int
flags,
int
startId)
{
Log.e("進(jìn)入服務(wù)3",
"進(jìn)入服務(wù)3");
showFloatingWindow();
return
super.onStartCommand(intent,
flags,
startId);
}
private
void
showFloatingWindow()
{
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.M)
{//判斷系統(tǒng)版本
if
(Settings.canDrawOverlays(this))
{
button
=
new
Button(getApplicationContext());
button.setText("我是個(gè)button窗口");
button.setBackgroundColor(Color.BLUE);
windowManager.addView(button,
layoutParams);
button.setOnTouchListener(new
FloatingOnTouchListener());
}
}
else
{
button
=
new
Button(getApplicationContext());
button.setText("我是個(gè)button窗口");
button.setBackgroundColor(Color.BLUE);
windowManager.addView(button,
layoutParams);
button.setOnTouchListener(new
FloatingOnTouchListener());
}
}
private
class
FloatingOnTouchListener
implements
View.OnTouchListener
{
private
int
x;
private
int
y;
@Override
public
boolean
onTouch(View
view,
MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
x
=
(int)
event.getRawX();
y
=
(int)
event.getRawY();
break;
case
MotionEvent.ACTION_MOVE:
int
nowX
=
(int)
event.getRawX();
int
nowY
=
(int)
event.getRawY();
int
movedX
=
nowX
-
x;
int
movedY
=
nowY
-
y;
x
=
nowX;
y
=
nowY;
layoutParams.x
=
layoutParams.x
+
movedX;
layoutParams.y
=
layoutParams.y
+
movedY;
windowManager.updateViewLayout(view,
layoutParams);
break;
default:
break;
}
return
false;
}
}思路簡單解釋:首先獲取WindowManager服務(wù),然后定義并設(shè)置在window上顯示的layoutParams(此處需注意Android8.0以上版本中LayoutParam里的type變量變?yōu)門YPE_APPLICATION_OVERLAY與Android8.0以下版本LayoutParam里的type變量TYPE_PHONE不一樣,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年消防設(shè)備使用與維護(hù)技能測試題
- 2026年教育學(xué)專業(yè)知識(shí)與技能教師資格筆試考題
- 2025年幼兒園教師資格考試題及答案
- 2026年環(huán)境工程設(shè)計(jì)與實(shí)施要點(diǎn)考試預(yù)測題
- 2025年廣漢市事業(yè)單位考試真題附答案
- 幕墻美學(xué)設(shè)計(jì)指導(dǎo)方案
- 智能家居控制系統(tǒng)集成方案
- 軋鋼培訓(xùn)教學(xué)課件
- 跳繩培訓(xùn)教學(xué)課件
- 跆拳道技術(shù)培訓(xùn)教程課件
- 人教版四年級(jí)數(shù)學(xué)上學(xué)期期末沖刺卷(B)(含答案)
- 高齡婦女孕期管理專家共識(shí)(2024版)解讀
- 2025年6月上海市高考語文試題卷(含答案詳解)
- 地下礦山采掘安全培訓(xùn)課件
- 豬場駐場技術(shù)工作匯報(bào)
- 小程序海豚知道看課件
- 留置看護(hù)培訓(xùn)課件
- 數(shù)據(jù)要素流通標(biāo)準(zhǔn)化白皮書(2024版)
- 工程制藥專業(yè)畢業(yè)論文
- 傳統(tǒng)米醋制作工藝流程介紹
- 2025年冷水機(jī)組考試題庫及答案
評(píng)論
0/150
提交評(píng)論