話不多說,先上效果圖
**是用kotlin寫的,kotlin也是剛學的,寫的可能不怎麼好。
起因
思路
1、 通過windowmanager 新增兩個view,乙個是控制器懸浮球,乙個是展開頁面的載體
kotlin 沒有高亮。。。。fun addfloatingwindow()
}if (!isaddview) }}
這裡只是做了簡單的許可權判斷,實際應用到專案中,許可權自行管理即可
2、通過切換windowmanager.layoutparams 的 flag 來改變兩個view的焦點問題
關於flag網上已經有很多文章寫的很明白了 這裡就不贅述了,這裡之所以要切換焦點,使用底層的view是全屏的且一直存在的,如果不切換焦點的話,觸控事件無法傳遞。baselayoutparams?.flags = windowmanager.layoutparams.flag_not_touch_modal
controllayoutparams?.flags = windowmanager.layoutparams.flag_not_touchable or windowmanager.layoutparams.flag_not_focusable
3、縮放效果
3.1、 最開始的想法是通過改變windowmanager.layoutparams的寬高來處理的,但是在window上使用動畫,總是出現掉幀,達不到效果
3.2、第二種也是為什麼我要使用兩層的原因,我使用view來做這個動畫效果,使用view做縮放動畫有兩種方式 :一 、canvas.clip(…) 無法消除鋸齒(放棄) 二、使用paint的xfermod來處理 能消除鋸齒(採用)
4、移除區域private fun init()
}override fun draw(canvas: canvas)
因為是兩層的關係 ,所以做移除區域就很簡單,只要底層畫出相應的塊即可。
demogithub原始碼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)}}
}
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...