【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗全系統(tǒng)版本_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論