仿微信懸浮窗,可縮放懸浮窗,支援自定義展開布局

2021-09-02 06:35:29 字數 2242 閱讀 3361

話不多說,先上效果圖

**是用kotlin寫的,kotlin也是剛學的,寫的可能不怎麼好。

起因

思路

1、 通過windowmanager 新增兩個view,乙個是控制器懸浮球,乙個是展開頁面的載體

fun addfloatingwindow() 

}if (!isaddview) }}

kotlin 沒有高亮。。。。

這裡只是做了簡單的許可權判斷,實際應用到專案中,許可權自行管理即可

2、通過切換windowmanager.layoutparams 的 flag 來改變兩個view的焦點問題

baselayoutparams?.flags = windowmanager.layoutparams.flag_not_touch_modal

controllayoutparams?.flags = windowmanager.layoutparams.flag_not_touchable or windowmanager.layoutparams.flag_not_focusable

關於flag網上已經有很多文章寫的很明白了 這裡就不贅述了,這裡之所以要切換焦點,使用底層的view是全屏的且一直存在的,如果不切換焦點的話,觸控事件無法傳遞。

3、縮放效果

3.1、 最開始的想法是通過改變windowmanager.layoutparams的寬高來處理的,但是在window上使用動畫,總是出現掉幀,達不到效果

3.2、第二種也是為什麼我要使用兩層的原因,我使用view來做這個動畫效果,使用view做縮放動畫有兩種方式 :一 、canvas.clip(…) 無法消除鋸齒(放棄) 二、使用paint的xfermod來處理 能消除鋸齒(採用)

private fun init() 

}override fun draw(canvas: canvas)

4、移除區域

因為是兩層的關係 ,所以做移除區域就很簡單,只要底層畫出相應的塊即可。

override fun ondraw(canvas: canvas?)  else 

paint.color = deltextcolor

paint.gettextbounds(deltext, 0, deltext.length, textrect)

drawtext(deltext, width.tofloat() - (srcradius-textrect.width())/2-textrect.width(), height.tofloat() -(srcradius-textrect.height())/2, paint)}}

}

demogithub原始碼

floatingview

如何引入

在專案根 build.gradle 新增

allprojects 

}}

在使用的模組下新增

dependencies
需要使用的許可權

如何使用

//建立例項物件

floatingwindow floatingwindow=new floatingwindow(this);

//設定展開的布局

floatingwindow.addrealcontentview(view.inflate(this,r.layout.test,null));

//設定懸浮窗圖示

floatingwindow.setminiwindowicon(r.mipmap.ic_launcher_round);

//顯示

floatingwindow.addfloatingwindow();

//關閉

floatingwindow.removefloatingwindow();

Swift仿寫微信懸浮窗功能

自己也模仿寫了乙個類似的控制項,執行效果如下 向你的專案中新增三個檔案 uiviewcontroller ff.swift suspendtool.swift suspendwindow.swift。在需要懸浮的uiviewcontroller中觸發懸浮的 中加上下面這行 self.suspend ...

Andorid 任意介面懸浮窗,實現懸浮窗如此簡單

1.支援拖動,提供自動貼邊等動畫 2.內部自動進行許可權申請操作 3.可自由指定要顯示懸浮窗的介面 4.應用退到後台時,懸浮窗會自動隱藏 5.位置不可變的懸浮窗無需許可權申請 6.位置及寬高可設定百分比值,輕鬆適配各解析度 7.鏈式呼叫,簡潔清爽 第 1 步 在工程的 build.gradle 中新...

IOS 應用懸浮窗

在應用的檢視的最頂層新增乙個uiwindow,用這個uiwindow 充當懸浮窗,給uiwindow新增移動的手勢監聽,讓懸浮窗隨著手指移動,釋放的時候,讓它以動畫的方式靠邊 懸浮窗測試 建立乙個懸浮視窗 mwindow assistivetouch alloc initwithframe cgre...