Flutter 107: 圖解自定義 ACEPageMenu 滑動(dòng)菜單 (二)

??????小菜繼續(xù)完善自定義 ACEPageMenu 滑動(dòng)菜單婿禽;主要處理基本的點(diǎn)擊事件以及在測(cè)試過程中遇到的小問題雀摘;

Offstage & Opacity

??????小菜在剛開始嘗試過程中遇到一個(gè)問題悠砚,當(dāng)只展示頂部和底部 Menu 時(shí)聘殖,Menu 中點(diǎn)擊事件無法觸發(fā)摄凡;分析之后發(fā)現(xiàn),小菜是在層級(jí) Stack 中存放四周 Menu,當(dāng)時(shí)采用 Offstage 使兩側(cè) Menu 不展示,但小菜忽略了一點(diǎn)技扼,Offstage 雖然是視覺不可見,但其子 Widget 依舊存在嫩痰,類似于 Androidandroid:visibility="invisible"剿吻;

??????之前小菜有總結(jié)過,采用 Offstage 可避免不展示的內(nèi)容不進(jìn)行繪制串纺,調(diào)整之后便不會(huì)遮擋其他 Menu 的點(diǎn)擊事件丽旅;

switch (menuType) {
  case MenuType.MENU_TOP:
    _menuWid = Offstage(
        offstage: _isShowTopMenu || _isShowMixMenu ? false : true,
        child: _topMenuWid());
    break;
  case MenuType.MENU_BOTTOM:
    _menuWid = Offstage(
        offstage: _isShowBottomMenu || _isShowMixMenu ? false : true,
        child: _bottomMenuWid());
    break;
  case MenuType.MENU_LEFT:
    _menuWid = Offstage(
        offstage: _isShowLeftMenu ? false : true, child: _leftMenuWid());
    break;
  case MenuType.MENU_RIGHT:
    _menuWid = Offstage(
        offstage: _isShowRightMenu ? false : true, child: _rightMenuWid());
    break;
}

typedef

??????小菜在自定義滑動(dòng)菜單時(shí)椰棘,會(huì)有很多類似的圖標(biāo)按鈕,為了代碼的簡(jiǎn)潔性榄笙,通過 typedef 提取公共的點(diǎn)擊事件邪狞;

typedef void OnMenuItemClicked(MenuItemType menuItemType, var operateData);

return GestureDetector(
    child: Container(
        height: MenuManager.topMenuIconSize,
        width: MenuManager.topMenuIconSize,
        child: Center(child: Icon(icon, color: Colors.white))),
    onTap: () => menuItemClick(type, null));

??????typedef 小菜通常用作提取公共方法,可當(dāng)作希望指定特定功能匹配的功能簽名茅撞;借助 typedef帆卓,既可以將變量分配給函數(shù),也可以當(dāng)作函數(shù)參數(shù)米丘;

typedef void OnItemClicked(MenuItemType menuItemType, var operateData);

itemClick01(type, data) {
  print('---itemClick01---type=$type---data=$data---');
}

itemClick02(type, data) {
  print('---itemClick02---type=$type---data=$data---');
}

OnItemClicked itemClicked = itemClick01;
itemClicked(MenuItemType.MENU_CATALOG, 'Catalog!');
itemClicked = itemClick02;
itemClicked(MenuItemType.MENU_QZONE, 'QZone!');

ListView 頭部空白

??????小菜在嘗試左側(cè)滑動(dòng)菜單時(shí)剑令,添加了一個(gè) ListView 作為數(shù)據(jù)展示,但嘗試過程發(fā)現(xiàn) ListView 頂部會(huì)有一塊空白區(qū)域蠕蚜,而小菜并未設(shè)置 Header 或內(nèi)外邊距尚洽;查閱資料發(fā)現(xiàn),當(dāng) ListView 沒有與 AppBar 共同使用時(shí)靶累,MediaQuery 會(huì)默認(rèn)設(shè)置一個(gè) padding,通過 remove 去掉即可癣疟;

return MediaQuery.removePadding(
    removeTop: true,
    context: context,
    child: Container(
        child: ListView.builder(
            itemCount: 100,
            itemBuilder: (context, index) {
              return Padding(
                  padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 4.0, bottom: 4.0),
                  child: Row(children: <Widget>[
                    Expanded(child: Text('當(dāng)前 item = 當(dāng)前 item = 當(dāng)前 item =${index + 1}', style: TextStyle(fontSize: 16))),
                    Padding(child: Icon(Icons.lock_open, size: 14), padding: EdgeInsets.only(left: 10))
                  ]));
            })));

RawGestureDetector

??????小菜需要處理復(fù)雜的手勢(shì)操作挣柬,包括滑動(dòng)點(diǎn)擊等,單純的 GestureDetector 不足以完成睛挚,于是小菜嘗試用 RawGestureDetector 來處理手勢(shì)操作集合邪蛔;

class RawGestureDetector extends StatefulWidget {
  const RawGestureDetector({
    Key key,
    this.child,
    this.gestures = const <Type, GestureRecognizerFactory>{},
    this.behavior,
    this.excludeFromSemantics = false,
    this.semantics,
  })
}

??????RawGestureDetector 作為一個(gè)有狀態(tài)的 StatefulWidget 小部件,主要是處理 gestures 來攔截各種手勢(shì)操作扎狱;針對(duì)手勢(shì)這部分侧到,小菜會(huì)在今后的博客中詳細(xì)學(xué)習(xí),今天僅為實(shí)現(xiàn)基本的功能淤击;

??????小菜優(yōu)先實(shí)現(xiàn)基本的點(diǎn)擊事件匠抗,在攔截點(diǎn)擊時(shí),小菜通過 onUpdateonEnd 配合處理污抬,當(dāng)沒有進(jìn)行滑動(dòng)汞贸,即手勢(shì)點(diǎn)擊的 Point 坐標(biāo)未改變時(shí),并且在 onEnd 方法中可攔截作為一次有效的點(diǎn)擊操作印机;

RawGestureDetector(
  child: CustomPaint(painter: CommonLinePainter(context, 50.0)),
  gestures: <Type, GestureRecognizerFactory>{
    MenuGestureRecognizer:
        GestureRecognizerFactoryWithHandlers<MenuGestureRecognizer>(
            () => MenuGestureRecognizer(),
            (MenuGestureRecognizer gesture) {
      gesture.onDown = (detail) {
        print('---MenuGestureRecognizer.onDown---$detail');
      };
      gesture.onUpdate = (detail) {
        _isGestureSlide = true;
        print('---MenuGestureRecognizer.onUpdate---$detail---${detail.localPosition}');
      };
      gesture.onEnd = (detail) {
        if (!_isGestureSlide) {
          _menuState(_isMenuShow ? MenuType.MENU_CLOSE : MenuType.MENU_MIX);
          _isMenuShow = !_isMenuShow;
        }
        _isGestureSlide = false;
        print('---MenuGestureRecognizer.onEnd---$detail---${detail.primaryVelocity}---${detail.velocity}---${detail.velocity.pixelsPerSecond}');
      };
    })
  }))

??????ACEPageMenu 案例源碼


??????小菜對(duì)自定義 ACEPageMenu 的功能還不夠完善矢腻,會(huì)逐漸學(xué)習(xí)補(bǔ)充;如有錯(cuò)誤射赛,請(qǐng)多多指導(dǎo)多柑!

來源: 阿策小和尚

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市楣责,隨后出現(xiàn)的幾起案子竣灌,更是在濱河造成了極大的恐慌聂沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帐偎,死亡現(xiàn)場(chǎng)離奇詭異逐纬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)削樊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門豁生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漫贞,你說我怎么就攤上這事甸箱。” “怎么了迅脐?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芍殖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谴蔑,道長(zhǎng)豌骏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任隐锭,我火速辦了婚禮窃躲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钦睡。我一直安慰自己蒂窒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布荞怒。 她就那樣靜靜地躺著洒琢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褐桌。 梳的紋絲不亂的頭發(fā)上衰抑,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音撩嚼,去河邊找鬼停士。 笑死,一個(gè)胖子當(dāng)著我的面吹牛完丽,可吹牛的內(nèi)容都是我干的恋技。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逻族,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜻底!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起聘鳞,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤薄辅,失蹤者是張志新(化名)和其女友劉穎要拂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站楚,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱惰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窿春。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拉一。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旧乞,靈堂內(nèi)的尸體忽然破棺而出蔚润,到底是詐尸還是另有隱情,我是刑警寧澤尺栖,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布嫡纠,位于F島的核電站,受9級(jí)特大地震影響延赌,放射性物質(zhì)發(fā)生泄漏除盏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一挫以、第九天 我趴在偏房一處隱蔽的房頂上張望痴颊。 院中可真熱鬧,春花似錦屡贺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糕再,卻和暖如春量没,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突想。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工殴蹄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猾担。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓袭灯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親绑嘹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稽荧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容