最近項目添加了一項調(diào)整應用字體大小功能,做完后空閑之余總結(jié)一下。本功能仿照微信應用“設(shè)置” - “通用” - “字體大小”功能,又有一點區(qū)別。據(jù)我所知,常見改變?nèi)肿煮w大小方法有兩種,我把這兩種分為可控和不可控,為什么這么分呢,當然不是為了方便記憶。那么簡單說下兩者方式的實現(xiàn)過程:
創(chuàng)新互聯(lián)是一家專業(yè)提供松江企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務。10年已為松江眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
1、不可控:通過重寫Actiivity的getResources()方法更新應用的字體倍數(shù)來調(diào)整全局字體大小
2、可控:通過setTheme()方法,一開始就初始化設(shè)置不同風格的字體樣式來更改全局字體大小。
而本文正式采用了第一種方案,主要是中途添加該功能,時間也不充裕,抽取字體大小又太過耗時。
微信字體大小個人猜測使用第二種方案,后者是更好的實現(xiàn)方式也不一定。
xml使用方式:
2、滑動按鈕改變當前頁面預覽字體大小
3、返回時,保存放大倍數(shù)并重啟應用
4、初始化應用時配置字體放大倍數(shù)。
源碼地址:
到這里就結(jié)束啦。
老習慣,先上圖,著急用的朋友,直接帶走Demo,先拿來用吧,畢竟老板催的緊,先把工作完成了,再看也來得及,是吧!
1、首先這是用GridView實現(xiàn)的
Adapter
彈出效果如下圖所示
可以使用setGravity()方法來指定彈出窗口與anchor視圖的對齊方式,例如修改對齊方式為Gravity.END
使用起來還是比較簡單的,但是好像大部分項目的需求是PopupMenu在用戶點擊的位置彈出,然而PopupMenu并沒有提供在指定坐標彈出的方法,所以只能咱們自己來實現(xiàn)咯!
想讓PopupMenu在指定彈出位置,首先咱們得先了解show()方法是如何讓PopupMenu彈出來的,所以只能去閱讀源碼了(Read The Fucking Source Code~)。
PopupMenu的show()方法很簡單,直接把任務轉(zhuǎn)給MenuPopupHelper來處理,處理流程:show() - tryShow() - showPopup(0, 0, false, false);
我們可以看到showPopup方法內(nèi)有兩個參數(shù)int xOffset、int yOffset,根據(jù)注釋可以知道這就是相對于anchor視圖的坐標值。所以如果要指定PopupMenu的彈出位置,MenuPopupHelper應該這樣處理彈出邏輯:show(int x, int y) - tryShow(int x, int y) - showPopup(x, y, true, true)。
但是由于PopupMenu無法調(diào)用到MenuPopupHelper的show(int x, int y) 方法,因此我們只能使用反射機制繞過PopupMenu,直接調(diào)用MenuPopupHelper的show(int x, int y)方法。
到此為止,已經(jīng)有了大致的解決思路,接下來看看具體實現(xiàn)。
最終彈出效果如下圖所示
SelectLocation: 仿微信位置選擇頁面 (gitee.com)
仿微信位置選擇頁面
仿照微信做的位置選擇
使用的是高德地圖,使用的時候記得換成自己的包名和key