網站首頁 編程語言 正文
Flutter中的按鈕
自Flutter 1.20 新增了ButtonStyleButton 系列按鈕,可以說非常好用了,默認樣式比之前漂亮了許多,擴展性也增加了很多。按鈕樣式統一由ButtonStyle這個類提供,支持根據各種狀態(MaterialState)變化的屬性,也增強了桌面平臺也友好性。
值 | 狀態 |
---|---|
hovered | 鼠標滑入 |
focused | 焦點 |
pressed | 按下 |
dragged | 拖動 |
selected | 選中 |
scrolledUnder | 與滾動內容疊加 |
disabled | 不可用 |
error | 錯誤 |
最常用到的就是pressed和disabled還有桌面端的hovered。
可變化的屬性
屬性 | 說明 | 備注 |
---|---|---|
backgroundColor | 背景色 | Flutter3.3版本之前對應 primary或onPrimary |
foregroundColor | 前景色(文本顏色) | Flutter3.3版本之前對應 primary或onPrimary |
elevation | 模擬物理深度 | 其實就是陰影淺重 |
fixedSize | 按鈕尺寸 | 受最大尺寸和最小尺寸和布局影響 |
maxinumSize | 最大尺寸 | ? |
minimumSize | 最小尺寸 | ? |
mouseCursor | 鼠標圖標 | ? |
overlayColor | 高亮色 | ? |
padding | 內容邊距 | ? |
shadowColor | 陰影顏色 | ? |
shape | 按鈕形狀 | 由OutlinedBorder定義 |
side | 邊框樣式 | ? |
surfaceTintColor | Material3使用的材質顏色 | ? |
textStyle | 文本樣式 | ? |
可以看到默認按鈕樣式,主要針對的是形狀,顏色和交互效果(overlay splash),普通情況下也夠用的。
不完美的地方
但是,要想進一步定制按鈕效果,比如設計師提供的按鈕,是漸變色的,那怎么辦呢? 比較常見的做法是用Container自己寫一個按鈕出來。Container的decoration可以說非常好用了,支持單色,漸變,以及裝飾圖。AnimatedContainer還能對各種屬性做動畫展現。
但是 按鈕要做的事情,不止是一個背景這么簡單。比如上面提到的狀態,以及點擊反饋,語義化等等。要使用Container把這一整套實現出來,會非常繁瑣。
在child中處理
Button的child可以是任何Widget,那么,把Container放到child里來實現定制背景怎樣呢?且不說Button默認的padding之類的,Button的效果,都是在背景層實現的,child中的任何可見元素,都會覆蓋在這層背景之上。簡單來說,就是覆蓋背景的同時會覆蓋掉Button的Splash等overlay效果。
外面套一個wrapper
把Button套進Container里,在Container的decoration中做背景。這個方法首先要做的就是把Button的背景和陰影去除,那么除了在Container里做背景,還要模擬出Button的陰影。
AnimatedContainer(
duration: Duration(milliseconds:200),
width: width,
height: height,
transformAlignment: Alignment.center,
clipBehavior: clipBehavior,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue,Colors.red]
),
shadow: [BoxShadow(
...
)]
),
child: ElevatedButton(
//...
),
);
初步來看,這個方法還是可行的。重點就在于怎么把需要增強的屬性組織起來,并且和按鈕的狀態結合起來了。
MaterialStateProperty
按鈕的動態屬性,都是基于這個狀態屬性處理的,它可以根據當前的屬性集合,匹配到合適的屬性提供回來。
MaterialStatesController
按鈕狀態的控制器,可以通過這個控制器來監聽按鈕的狀態,做出對應處理
邊距問題
ButtonStyle中有一個tapTargetSize屬性(非動態屬性),定義了點擊目標的擴展邊距,在移動設備上默認情況下按鈕會向上/下多出一點邊距,導致Container的背景比按鈕尺寸多出一塊,按鈕的overlay效果鋪不滿,手動指定TapTargetSize.shrinkWrap就可以了。
EnhancedButton
結合以上想法,整理了style及wrapper實現了一個增加的按鈕,效果如下
本來命名的ExtendedButton,結果被一個不維護的包占用了名字,就改成了EnhancedButton。雖然目前還有些許不完美的方面,以后再慢慢優化吧。
github: github.com/shirne/exte…
pub: pub.flutter-io.cn/packages/en…
原文鏈接:https://juejin.cn/post/7142073198115291144
相關推薦
- 2022-08-04 react項目優化配置的操作詳解_React
- 2022-12-10 c語言如何設置隨機數及逐行解析_C 語言
- 2024-01-08 Request請求轉發和Response重定向
- 2022-05-26 Flutter自定義彈窗Dialog效果_Android
- 2022-08-03 C++中TinyXML讀取xml文件用法詳解_C 語言
- 2023-01-23 Python操作MongoDB增刪改查代碼示例_python
- 2022-07-19 Linux硬盤分區步驟詳解
- 2022-08-19 ubuntu上設置Redis開機自啟
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支