久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

Flutter Sliver視差滾動(dòng)與沉浸式布局實(shí)戰(zhàn):從原理到鴻蒙適配

Flutter Sliver視差滾動(dòng)與沉浸式布局實(shí)戰(zhàn):從原理到鴻蒙適配 需要從零開(kāi)始講清楚的一件事Sliver 視差滾動(dòng)和沉浸式布局到底怎么落地最近我在做一款跨平臺(tái)內(nèi)容應(yīng)用目標(biāo)平臺(tái)包括 Android 和鴻蒙設(shè)備。設(shè)計(jì)稿里有一個(gè)很典型的品牌展示頁(yè)頂部大圖上滑后緩慢淡出標(biāo)題文字跟隨滾動(dòng)產(chǎn)生位移差列表內(nèi)容像浮在背景之上。這種效果在 Web 端用 position: sticky 加滾動(dòng)監(jiān)聽(tīng)很常見(jiàn)但放到 Flutter 里如果你沒(méi)有吃透 Sliver 機(jī)制第一反應(yīng)大概率是ListView 嵌套一個(gè) Transform然后你就會(huì)陷入手勢(shì)沖突、布局重建頻繁、幀率不穩(wěn)的三個(gè)泥潭。這篇文章是我把這套效果完整落地并且在鴻蒙設(shè)備上實(shí)測(cè)通過(guò)后的記錄適合正在做內(nèi)容類(lèi) App、需要實(shí)現(xiàn)靈動(dòng)頭圖或沉浸式詳情頁(yè)的 Flutter 開(kāi)發(fā)者也適合想系統(tǒng)理解 Sliver 原理、不想靠復(fù)制粘貼經(jīng)驗(yàn)貼混日子的朋友。先直接給結(jié)論Flutter 里實(shí)現(xiàn)視差滾動(dòng)和沉浸式布局正確的底座是 CustomScrollView Sliver 家族視差效果通過(guò)監(jiān)聽(tīng)滾動(dòng)位移并施加 Transform 偏移實(shí)現(xiàn)沉浸式則依賴(lài) SystemChrome 與安全區(qū) API 的組合。鴻蒙平臺(tái)上這套方案完全可行但有幾處和 Android 默認(rèn)行為不一致的細(xì)節(jié)我會(huì)把對(duì)應(yīng)處理方式一并寫(xiě)下。1. 為什么我盯著 Sliver 不放一個(gè)跨平臺(tái)內(nèi)容 App 的動(dòng)效訴求1.1 需求場(chǎng)景還原視差滾動(dòng)不是錦上添花是產(chǎn)品設(shè)計(jì)的一等公民我接到的需求從產(chǎn)品側(cè)看字面很簡(jiǎn)單詳情頁(yè)頭部圖片滾動(dòng)時(shí)要有層次感列表向上推過(guò)頭圖圖片不要整個(gè)跟著走要像被列表擠上去一樣同時(shí)狀態(tài)欄區(qū)域要透出頁(yè)面背景色不要讓白條破壞視覺(jué)。如果只看字面你可能會(huì)把它拆解成兩個(gè)獨(dú)立需求頭圖滾動(dòng)動(dòng)效 狀態(tài)欄透明。但在實(shí)際開(kāi)發(fā)中這兩件事會(huì)互相糾纏——你的滾動(dòng)容器決定了你用什么方式做沉浸式避讓你的沉浸式配置又會(huì)影響滾動(dòng)區(qū)域的頂部 padding。所以我一開(kāi)始就把它們當(dāng)成一個(gè)整體來(lái)設(shè)計(jì)這比逐個(gè)功能點(diǎn)打補(bǔ)丁要省事得多。這類(lèi)頁(yè)面通常包含三部分信息層級(jí)背景頭圖層大圖、漸變遮罩、品牌文案上滑時(shí)移動(dòng)速度慢于滾動(dòng)速度前景內(nèi)容層標(biāo)題、作者、正文卡片上滑速度正常或略快系統(tǒng) UI 層狀態(tài)欄、導(dǎo)航欄需要根據(jù)滾動(dòng)位置切換亮暗圖標(biāo)從交互上看前兩層之間就天然形成了視差列表滾動(dòng) 100 像素時(shí)頭圖只移動(dòng) 60 像素文字層移動(dòng) 200 像素三個(gè)層面速度不一致用戶(hù)感知到的就是一種空間深度。而沉浸式布局解決的是第三個(gè)層面——讓系統(tǒng)狀態(tài)欄不干擾這個(gè)深度視覺(jué)甚至把狀態(tài)欄區(qū)域也納入背景層的延伸范圍。1.2 為什么不用 PageView / ListView 硬拼嵌套滾動(dòng)的三大坑很多開(kāi)發(fā)者第一次遇到這種需求時(shí)會(huì)嘗試外層 SingleChildScrollView 內(nèi)部 ListView或者 ListView 里塞一個(gè) Stack 做視差變換。這種做法能出效果但幾乎必然踩到以下三個(gè)坑第一手勢(shì)歸屬?zèng)_突。內(nèi)層 ListView 和外層 SingleChildScrollView 都想處理縱向拖拽Flutter 的手勢(shì)競(jìng)技場(chǎng)比賽結(jié)果是只有一個(gè)贏得勝利實(shí)際表現(xiàn)就是滾動(dòng)一頓一頓、方向判斷延遲甚至在某些 Android 設(shè)備上出現(xiàn)拉不動(dòng)的假死感。你可以用 NeverScrollableScrollPhysics 禁掉內(nèi)層滾動(dòng)但這樣內(nèi)層列表就失去了懶加載能力數(shù)據(jù)量大時(shí)直接卡死。第二布局重建失控。ListView 的 itemBuilder 在你滾動(dòng)時(shí)會(huì)頻繁調(diào)用如果視差計(jì)算的 Transform 狀態(tài)放在外層 StatefulWidget 里每次滾動(dòng)都 setState 整棵樹(shù)會(huì)引發(fā)所有可見(jiàn) item 全部 rebuild很容易把幀耗時(shí)推到 20ms 以上。我在早期的項(xiàng)目里就因?yàn)檫@個(gè)被性能測(cè)試打回來(lái)過(guò)后來(lái)才發(fā)現(xiàn)問(wèn)題根本不在于圖片加載而在于 rebuild 范圍太大。第三安全區(qū)處理混亂。沉浸式布局下外層滾動(dòng)容器需要避讓狀態(tài)欄內(nèi)層列表又需要避讓底部導(dǎo)航欄兩個(gè)滾動(dòng)組件各自維護(hù)自己的 padding 時(shí)邊距會(huì)疊加或丟失出現(xiàn)內(nèi)容頂?shù)綘顟B(tài)欄或底部多出一大截的詭異效果。1.3 Sliver 真正的價(jià)值滾動(dòng)協(xié)議的統(tǒng)一抽象Sliversliver細(xì)長(zhǎng)片是 Flutter 對(duì)可滾動(dòng)區(qū)域的一種底層抽象CustomScrollView 內(nèi)部不再區(qū)分一個(gè)滾動(dòng)視圖里嵌套另一個(gè)滾動(dòng)視圖而是把所有區(qū)塊統(tǒng)統(tǒng)變成 Sliver 作為它的 children。這樣手勢(shì)、布局、滾動(dòng)偏移全部由 CustomScrollView 統(tǒng)一管理不會(huì)出現(xiàn)內(nèi)外嵌套的沖突。SliverAppBar 提供可折疊頭圖SliverList / SliverGrid 提供懶加載列表SliverToBoxAdapter 負(fù)責(zé)把普通 Widget 塞進(jìn)滾動(dòng)流SliverPersistentHeader 允許你精細(xì)控制固定在頂部的 Header。它們之間有統(tǒng)一的 SliverConstraints / SliverGeometry 協(xié)議滾動(dòng)過(guò)程中每個(gè) Sliver 通過(guò) layout 階段算出自己的幾何尺寸和繪制范圍。這就是為什么 Sliver 方案在復(fù)雜滾動(dòng)場(chǎng)景下更穩(wěn)健——它在架構(gòu)上避免了嵌套滾動(dòng)的手勢(shì)博弈同時(shí)保留了懶加載機(jī)制。因此我在這個(gè)項(xiàng)目里的技術(shù)選型是CustomScrollView 作為唯一滾動(dòng)體SliverAppBar 承載頭圖SliverList 承載正文配合 Transform.translate 實(shí)現(xiàn)視差配合 AnnotatedRegion / SafeArea 實(shí)現(xiàn)沉浸式適配。2. Sliver 體系的正確打開(kāi)方式CustomScrollView 的布局原理2.1 CustomScrollView SliverAppBar先跑通骨架如果你和我一樣是后知后覺(jué)才系統(tǒng)看 Sliver 的建議先不看原理文檔直接搭一個(gè)最小骨架感受它和 ListView 的差別。我的最小示例是這樣的CustomScrollView( slivers: [ SliverAppBar( expandedHeight: 260, pinned: true, flexibleSpace: FlexibleSpaceBar( title: Text(品牌頁(yè)), background: Image.network( https://example.com/header.jpg, fit: BoxFit.cover, width: double.infinity, height: 260, ), ), ), SliverList( delegate: SliverChildBuilderDelegate( (context, index) ListTile(title: Text(內(nèi)容行 $index)), childCount: 50, ), ), ], )這個(gè)骨架跑通后重點(diǎn)來(lái)了SliverAppBar 的 expandedHeight 決定了頭圖展開(kāi)高度pinned: true 意味著列表上滑過(guò)頭圖時(shí)返回按鈕和標(biāo)題欄會(huì)固定在頂部。FlexibleSpaceBar 是官方提供的柔性空間它會(huì)隨著滾動(dòng)自動(dòng)壓縮頭圖高度、縮放 title這已經(jīng)是一種官方視差了。但它的默認(rèn)行為偏保守——背景圖會(huì)跟著 FlexibleSpaceBar 的縮放而整體變化沒(méi)法做成圖片緩慢移動(dòng)、內(nèi)容層快速上移的層次感。所以我的做法是用 FlexibleSpaceBar 作為容器但把真正的視差動(dòng)畫(huà)從 title / background 里剝出來(lái)自己控制圖片層的 Transform。這樣才能精確模擬設(shè)計(jì)稿里頭圖被列表擠壓后緩慢上移的效果而不是官方那種整體透明度淡出的效果。2.2 SliverPersistentHeader自定義折疊邏輯的常用手法如果 SliverAppBar 滿(mǎn)足不了頭部表現(xiàn)比如你需要一個(gè)搜索框隨著滾動(dòng)縮小并固定在頂部的交互SliverPersistentHeader 是更自由的選擇。它要求你實(shí)現(xiàn)一個(gè) SliverPersistentHeaderDelegate核心方法有兩個(gè)minExtent折疊后的最小高度maxExtent展開(kāi)時(shí)的最大高度build(context, shrinkOffset, overlapsContent)根據(jù)當(dāng)前收縮量構(gòu)建 UI我在詳情頁(yè)里用它做了一個(gè)返回欄 分類(lèi) Tab 吸附頂部的組合。長(zhǎng)這樣class _SectionHeaderDelegate extends SliverPersistentHeaderDelegate { final double minExtent; final double maxExtent; final Widget Function(BuildContext, double) builder; override Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { return SizedBox( height: maxExtent - shrinkOffset, child: builder(context, shrinkOffset), ); } }這里要注意 shrinkOffset 的語(yǔ)義它表示這個(gè) Header 當(dāng)前被壓縮了多少像素。你可以用它驅(qū)動(dòng)透明度、字號(hào)變化甚至讓搜索框背景從不透明變透明。相比 SliverAppBar 的固定模式SliverPersistentHeader 更適合有業(yè)務(wù)狀態(tài)的頭部因?yàn)樗试S你在 build 里讀滾動(dòng)進(jìn)度并按需做任何插值。2.3 SliverToBoxAdapter自由混排普通 widgetCustomScrollView 的 children 必須是 Sliver那普通 Widget 怎么放進(jìn)去答案是 SliverToBoxAdapter。它把普通 Widget 包裝成一個(gè)高度等于內(nèi)容高度的 Sliver放進(jìn)滾動(dòng)流里。我在視差頁(yè)里用它來(lái)承載頭圖下方的卡片區(qū)、作者信息區(qū)、以及正文的起始段。它的缺點(diǎn)是一次全部構(gòu)建沒(méi)有懶加載所以只適合放內(nèi)容數(shù)量可控的區(qū)塊如果你要放幾萬(wàn)行數(shù)據(jù)必須用 SliverList。實(shí)踐中我的慣用編排是CustomScrollView( slivers: [ // 頭圖 SliverAppBar // 分類(lèi) Tab 固定頭 SliverToBoxAdapter(child: 頂部卡片區(qū)), SliverList(delegate: 長(zhǎng)內(nèi)容列表), ], )這樣的好處是長(zhǎng)列表部分仍然保持懶加載卡片區(qū)因?yàn)閮?nèi)容少、構(gòu)建成本低一次構(gòu)建完全沒(méi)問(wèn)題。整體滾動(dòng)由 CustomScrollView 統(tǒng)一管理手勢(shì)不會(huì)分裂也不會(huì)出現(xiàn)內(nèi)外列表競(jìng)爭(zhēng)的問(wèn)題。3. 視差滾動(dòng)從零手寫(xiě)滾動(dòng)位移與圖層偏移的計(jì)算邏輯3.1 監(jiān)聽(tīng)滾動(dòng)的三種姿勢(shì)及取舍有了 CustomScrollView 骨架之后視差滾動(dòng)就成了怎么拿到滾動(dòng)位移、怎么把它換算成各圖層的偏移量的問(wèn)題。我實(shí)測(cè)下來(lái)有三種主流的監(jiān)聽(tīng)方式ScrollController.addListener簡(jiǎn)單直接一切滾動(dòng)都能拿到 controller.offset但監(jiān)聽(tīng)粒度是整個(gè)控制器且需要手動(dòng) disposeNotificationListener 可以拿到滾動(dòng)增量 scrollDelta、像素位置 metrics.pixels 等細(xì)節(jié)不必依賴(lài) controller而且可以在列表層級(jí)上精確控制只有我這個(gè)區(qū)域滾動(dòng)時(shí)才觸發(fā)scrollController.position.isScrollingNotifier適合做是否正在滾動(dòng)的狀態(tài)判斷對(duì)進(jìn)入頁(yè)面時(shí)的動(dòng)畫(huà)驅(qū)動(dòng)比較友好我在視差頁(yè)里最終選了 NotificationListener ScrollUpdateNotification原因是它能同時(shí)拿到當(dāng)前像素位置和本次增量對(duì)于多層視差計(jì)算來(lái)說(shuō)信息最完整。代碼骨架如下NotificationListenerScrollUpdateNotification( onNotification: (notification) { final pixels notification.metrics.pixels; setState(() { headerOffset pixels * 0.35; // 背景層慢速 contentOffset pixels * 1.2; // 前景層加速 }); return false; }, child: CustomScrollView(...), )注意 return false表示不攔截通知讓滾動(dòng)繼續(xù)傳播。這是我一開(kāi)始最容易忽略的點(diǎn)——如果 return true滾動(dòng)會(huì)被消費(fèi)掉頁(yè)面直接沒(méi)法動(dòng)了。3.2 用 Transform.translate 實(shí)現(xiàn)多層視差拿到滾動(dòng)位移后真正的視覺(jué)魔法在 Transform.translate。對(duì)需要做視差的圖層把它包在 Transform.translate 里根據(jù)滾動(dòng)偏移量給它一個(gè)速度因子即可Transform.translate( offset: Offset(0, headerOffset), child: Container( width: double.infinity, height: 260, decoration: BoxDecoration( image: DecorationImage( image: NetworkImage(headerUrl), fit: BoxFit.cover, ), ), ), )慢速層速度因子設(shè)為 0.3~0.5意思是你滾了 100 像素它只移動(dòng) 30 到 50 像素前景文字層速度因子設(shè)為 1.2滾 100 像素它移動(dòng) 120 像素視覺(jué)上就領(lǐng)先了背景層。三個(gè)速度不同的圖層疊在一起視差感立刻就出來(lái)了。但這里有一個(gè)容易翻車(chē)的地方Transform.translate 只是改變了繪制位置圖層原有布局位置沒(méi)變。如果背景層移動(dòng)后露出了下方空白你可能需要在容器外再包一個(gè) ClipRect 把多余部分裁掉或者把背景層放進(jìn) SliverAppBar 的 expandedHeight 范圍內(nèi)利用 SliverAppBar 自身的收縮特性來(lái)限定可見(jiàn)區(qū)域。我的做法是把頭圖的裁剪交給 SliverAppBar 的 expandedHeight視差偏移只在一個(gè)比屏幕稍寬的容器內(nèi)作用這樣既不會(huì)溢出也不會(huì)出現(xiàn)空白。3.3 視差因子與緩動(dòng)讓速度和手感匹配視差因子的選擇不是隨意的。我的經(jīng)驗(yàn)是從物理感受反推背景層離用戶(hù)遠(yuǎn)移動(dòng)應(yīng)該慢內(nèi)容層離用戶(hù)近移動(dòng)應(yīng)該快。純數(shù)字比例要統(tǒng)一否則會(huì)暈。比較合理的起始值是背景 0.3、內(nèi)容 1.0、前景裝飾 1.3然后再根據(jù)真實(shí)設(shè)備微調(diào)。另外一個(gè)容易被忽略的點(diǎn)是慣性滾動(dòng)和過(guò)度滾動(dòng)對(duì)視差效果的影響。當(dāng)用戶(hù)手指離開(kāi)屏幕快速甩動(dòng)時(shí)滾動(dòng)會(huì)進(jìn)入慣性階段此時(shí) notifications 的 pixels 仍然在變化但變化幅度大且非線(xiàn)形。如果視差因子里沒(méi)有做 Clamping背景層可能會(huì)因?yàn)閼T性沖到頁(yè)面頂部之外或者甩過(guò)頭。為了解決這個(gè)問(wèn)題我會(huì)給背景層的偏移量做 clampfinal bgOffset (pixels * 0.3).clamp(-40.0, 0.0); final contentOffset (pixels * 1.2).clamp(0.0, 80.0);clamp 之后背景層只會(huì)從 0 移到 -40內(nèi)容層最多領(lǐng)先 80 像素滾動(dòng)結(jié)束后的視覺(jué)位置是可控的不會(huì)出現(xiàn)元素跑飛的尷尬。這里我再分享一個(gè)手感小技巧視差滾動(dòng)的速度因子并不需要全屏范圍線(xiàn)性不變。你可以在頁(yè)面頭部區(qū)域設(shè)置一個(gè)衰減系數(shù)比如滾動(dòng)超過(guò) 400 像素后背景層速度因子從 0.3 降到 0.1。這樣用戶(hù)快速劃過(guò)頭部后視線(xiàn)會(huì)自動(dòng)聚焦到正文不會(huì)因?yàn)楸尘俺掷m(xù)高速移動(dòng)而分心。用代碼表達(dá)就是double speedFactor(double pixels) { if (pixels 400) return 0.3; return 0.1 0.2 * (400 / pixels).clamp(0.0, 1.0); }衰減的目標(biāo)是讓視差效果集中在頭圖可見(jiàn)階段而不是貫穿整個(gè)長(zhǎng)頁(yè)面。4. 沉浸式布局的完整鏈路狀態(tài)欄、安全區(qū)與頁(yè)面容器4.1 全屏沉浸的 SystemChrome 配置視差效果一旦做出來(lái)頁(yè)面頂部的狀態(tài)欄就會(huì)成為視覺(jué)干擾源——白底黑字狀態(tài)欄會(huì)橫穿一整條把頭圖切成兩截。沉浸式布局的第一步就是讓?xiě)?yīng)用內(nèi)容延伸到狀態(tài)欄和系統(tǒng)導(dǎo)航欄區(qū)域。在 Flutter 里最核心的 API 是 SystemChrome.setEnabledSystemUIMode 和 SystemUiOverlayStyle。我常用的配置SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.light, systemNavigationBarColor: Colors.transparent, systemNavigationBarIconBrightness: Brightness.dark, ));edgeToEdge 模式下應(yīng)用布局會(huì)擴(kuò)展到屏幕物理邊緣狀態(tài)欄和導(dǎo)航欄變成覆蓋層。statusBarColor 設(shè)置成透明確保頭圖能一路畫(huà)到屏幕頂部。注意 icon brightness頭圖區(qū)域偏深色時(shí)用淺色圖標(biāo)滾動(dòng)到正文區(qū)后要切回深色圖標(biāo)否則圖標(biāo)會(huì)淹沒(méi)在淺色背景里看不清。我在沉浸式頁(yè)面里通常不會(huì)把 SystemChrome 調(diào)用寫(xiě)到 initState 里就完事而是用一個(gè)滾動(dòng)位置驅(qū)動(dòng)的監(jiān)聽(tīng)器在滾動(dòng)超過(guò)頭圖區(qū)域后動(dòng)態(tài)切換狀態(tài)欄圖標(biāo)顏色if (_scrollOffset 180) { SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.dark), ); } else { SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.light), ); }這個(gè)調(diào)用頻率不用太高——12Hz 就夠視覺(jué)平滑了并且它對(duì)性能幾乎沒(méi)有影響系統(tǒng)只會(huì)在調(diào)用時(shí)重新染一遍狀態(tài)欄圖標(biāo)顏色不會(huì)觸發(fā)頁(yè)面重建。4.2 SafeArea 與 MediaQuery安全區(qū)避讓的正確姿勢(shì)edgeToEdge 開(kāi)啟后原本沉浸式布局會(huì)把內(nèi)容推進(jìn)到狀態(tài)欄和全面屏底部導(dǎo)航區(qū)如果你不做避讓文字和點(diǎn)擊區(qū)域就會(huì)被系統(tǒng) UI 擋住。Flutter 提供的 SafeArea 會(huì)讀取 MediaQuery.padding給子組件加 padding。但這里有個(gè)新手容易犯的錯(cuò)誤在一個(gè) CustomScrollView 里直接在外層套 SafeArea 會(huì)讓整個(gè)滾動(dòng)區(qū)域都被 padding 頂開(kāi)頭圖反而縮到狀態(tài)欄下面視覺(jué)上就變成上面一條白邊 下面一條黑邊根本不是沉浸式。正確姿勢(shì)是區(qū)分容器避讓和內(nèi)容避讓。滾動(dòng)容器本身不避讓頂部讓頭圖完整畫(huà)到屏幕最上方頭圖內(nèi)部再根據(jù) MediaQuery.padding.top 給返回按鈕和標(biāo)題做避讓。底部同理正文最后一個(gè)區(qū)塊用 SafeArea(top: false) 包裹只避讓底部導(dǎo)航條。CustomScrollView( slivers: [ SliverAppBar( expandedHeight: 260, pinned: true, titleSpacing: 0, flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ // 頭圖背景 // 頂部避讓信息區(qū) SafeArea( child: Padding( padding: EdgeInsets.only(top: 8), child: Row(children: [返回按鈕, 標(biāo)題]), ), ), ], ), ), ), SliverToBoxAdapter( child: 正文內(nèi)容, ), SliverToBoxAdapter( child: SafeArea(top: false, child: 底部操作欄), ), ], )為什么不能讓整個(gè) SafeArea 包在外層因?yàn)闈L動(dòng)視圖的布局范圍是整個(gè)屏幕如果你用 SafeArea 包住它滾動(dòng)視圖的可視高度就變成了屏幕高度減去頂部和底部 padding頭圖無(wú)論怎么滾都到不了屏幕真正的最頂端。沉浸式視覺(jué)必須讓滾動(dòng)視圖的邊界等于物理屏幕避讓交給內(nèi)部子元素處理。4.3 沉浸式頁(yè)面的返回手勢(shì)和底部手勢(shì)沖突處理沉浸式必然面對(duì)一個(gè)交互沖突頁(yè)面內(nèi)容畫(huà)到了屏幕最底部全面屏手勢(shì)上滑回桌面、側(cè)滑返回會(huì)在導(dǎo)航區(qū)域觸發(fā)。如果你的頁(yè)面底部有橫向滾動(dòng)或需要精細(xì)觸摸的控件很容易被系統(tǒng)手勢(shì)吃掉。我在項(xiàng)目里的處理策略有三個(gè)層面頁(yè)面不需要橫向手勢(shì)的區(qū)塊不做特殊處理直接交給系統(tǒng)底部有 TabBar 或橫向內(nèi)容時(shí)用 GestureDetector 設(shè)置 behavior: HitTestBehavior.opaque并配合 rawDrag 的手勢(shì)方向判定只在水平方向位移超過(guò)閾值時(shí)接管手勢(shì)返回手勢(shì)沖突最嚴(yán)重的場(chǎng)景是頁(yè)面右邊緣有橫向輪播圖這時(shí)我會(huì)把輪播圖區(qū)域避開(kāi)屏幕右側(cè)邊緣 8-16 像素給系統(tǒng)手勢(shì)留出空間而不是強(qiáng)行和系統(tǒng)搶手勢(shì)這個(gè)方案在 Android 上表現(xiàn)穩(wěn)定在鴻蒙上我也用了同樣的策略結(jié)果比較接近但有一個(gè)細(xì)節(jié)差異鴻蒙的側(cè)滑返回手勢(shì)區(qū)比 Android 更寬我最后把輪播圖避讓寬度從 8 像素調(diào)到了 16 像素實(shí)測(cè)誤觸率才降下來(lái)。這個(gè)問(wèn)題在小尺寸 Android 設(shè)備上也存在建議你在設(shè)計(jì)時(shí)統(tǒng)一按邊緣 16 像素不可交互的規(guī)范來(lái)做別等用戶(hù)反饋再補(bǔ)。5. 鴻蒙適配的真實(shí)體驗(yàn)我知道的那些坑與解法5.1 在鴻蒙 NEXT 設(shè)備上跑 Flutter SDK 的基本情況做跨平臺(tái)項(xiàng)目最麻煩的永遠(yuǎn)是每個(gè)平臺(tái)都有自己的小脾氣。鴻蒙這塊目前 Flutter 主流方案是使用支持 OpenHarmony 的 Flutter SDK 分支構(gòu)建產(chǎn)物可以打包成 HAP/APP 在鴻蒙 NEXT 設(shè)備或模擬器上運(yùn)行。社區(qū)里對(duì)這個(gè)坑的常規(guī)認(rèn)知是能用但需要額外做好三件事——選對(duì) SDK 分支、拆掉不兼容插件、手動(dòng)處理構(gòu)建腳本。我實(shí)際測(cè)試是先用開(kāi)源社區(qū)維護(hù)的 OpenHarmony Flutter 分支集成到 dev 分支跑的。構(gòu)建鏈路里需要手動(dòng)配置 ohos 工程殼類(lèi)似 Android 的 build.gradle 和 iOS 的 Xcode 工程只是換成了 DevEco Studio 工程文件。頭部、底部導(dǎo)航、CustomScrollView 這些 Flutter 控件在鴻蒙上渲染是沒(méi)問(wèn)題的因?yàn)?Flutter 引擎在鴻蒙上用的是 Skia 渲染管線(xiàn)繪制結(jié)果和 Android 基本一致。5.2 實(shí)際遇到的渲染與布局差異運(yùn)行穩(wěn)定的前提下布局差異還是有的我遇到了三個(gè)比較有代表性的第一是安全區(qū)數(shù)值不同。鴻蒙設(shè)備上 MediaQuery.padding.top 的值和同尺寸 Android 設(shè)備不完全一致特別是帶挖孔屏的機(jī)型頂部 status bar 高度差異在 10-20 像素之間。我的解決方案很樸素不硬編碼任何狀態(tài)欄高度所有避讓都走 MediaQuery并在頁(yè)面頂部留一個(gè)至少 16 像素的視覺(jué)冗余區(qū)。第二是字體和渲染差異。鴻蒙默認(rèn)使用 HarmonyOS Sans和 Android 上的 Roboto / 系統(tǒng)默認(rèn)中文字體在字寬上不同同一個(gè)文本組件在兩端的文本溢出情況會(huì)不一樣。我的做法是在內(nèi)容布局里給文本容器預(yù)留 10%-15% 的彈性空間而不是精確到像素。最危險(xiǎn)的是 Row 里多個(gè) Text 擠成一排一旦鴻蒙字體更寬就溢出。建議所有固定寬度的文本行都改成 Flex TextOverflow.ellipsis 的組合。第三是滾動(dòng)物理效果不同。鴻蒙默認(rèn)的滾動(dòng)回彈手感接近 iOS 的 BouncingScrollPhysics但 Android 上默認(rèn)是 ClampingScrollPhysics沒(méi)有回彈。同樣的頁(yè)面在鴻蒙上列表會(huì)彈一下Android 上貼邊緣停頓。如果你不想讓用戶(hù)在兩端看到不一致必須顯式在 CustomScrollView 里指定 physicsCustomScrollView( physics: Platform.isAndroid ? const ClampingScrollPhysics() : const BouncingScrollPhysics(), ... )跨平臺(tái)項(xiàng)目里這種隱式不一致比顯式崩潰還討厭——它不報(bào)錯(cuò)但體驗(yàn)差異會(huì)讓用戶(hù)覺(jué)得你的 App 很粗糙。5.3 插件生態(tài)的適配現(xiàn)狀我的項(xiàng)目里依賴(lài)的插件不多但典型shared_preferences、dio、cached_network_image、path_provider、fluro。純 Dart 實(shí)現(xiàn)的包dio、fluro不需要任何改動(dòng)直接可用cached_network_image 里面依賴(lài)了 flutter_cache_manager底層用了 path_provider 和 sqflite需要確認(rèn)這幾個(gè)包在鴻蒙端有實(shí)現(xiàn)。真正需要繞道的是依賴(lài) Android/iOS 原生 SDK 的能力比如 google_maps_flutter、firebase 全家桶、部分第三方登錄 SDK。這類(lèi)插件除非鴻蒙官方或者社區(qū)有人寫(xiě)了對(duì)應(yīng)的 ohos 實(shí)現(xiàn)否則在鴻蒙端跑不起來(lái)。我的規(guī)避策略有兩個(gè)一是抽象一層平臺(tái)能力接口在 Android 端直接用原生插件在鴻蒙端用自研的簡(jiǎn)化實(shí)現(xiàn)或者 WebView 方案代替二是排查依賴(lài)樹(shù)把非必要的 Android-only 插件隔離到條件導(dǎo)入里防止它們?cè)邙櫭蓸?gòu)建時(shí)報(bào)編譯錯(cuò)誤。這里有一個(gè)具體的檢查技巧看插件目錄里有沒(méi)有 ohos/ 目錄或 plugin 聲明文件如果沒(méi)有基本可以判定鴻蒙不支持。我在項(xiàng)目里寫(xiě)了一個(gè)簡(jiǎn)單的 Dart 腳本遍歷 pubspec.lock 里的所有包檢查它們?cè)诒镜?pub cache 里是否存在 ohos 目錄一步就能找出鴻蒙未知風(fēng)險(xiǎn)插件。6. 性能與交互的平衡我的實(shí)測(cè)數(shù)據(jù)和調(diào)優(yōu)心得6.1 卡頓根因setState 范圍過(guò)大的常見(jiàn)問(wèn)題第一版視差滾動(dòng)跑起來(lái)后我在低端 Android 設(shè)備驍龍 6806GB RAM上測(cè)試幀率明顯不穩(wěn)。Profile 模式下看到滾動(dòng)時(shí)有大量 rebuild問(wèn)題就出在最常見(jiàn)的寫(xiě)法上在 NotificationListener 的 onNotification 里調(diào)用整頁(yè) setState。只要 scrollOffset 一變整個(gè) CustomScrollView 所有可見(jiàn) Sliver 全部重建包括下面幾十個(gè)列表項(xiàng)。雖然 Flutter 的 widget 重建成本沒(méi)那么高但列表項(xiàng)里還有網(wǎng)絡(luò)圖和富文本累積起來(lái)就把幀時(shí)長(zhǎng)拖到 22ms 以上折算約 45fps體感就一個(gè)字卡。優(yōu)化思路不是減少 setState 次數(shù)而是縮小 rebuild 范圍。滾動(dòng)位移變化天然就是連續(xù)的你不可能靠節(jié)流解決根本問(wèn)題因?yàn)槟愦_實(shí)需要每一幀都讓背景層移動(dòng)。所以正確的做法是把受滾動(dòng)影響的節(jié)點(diǎn)隔離到一個(gè)小的 widget 里讓它們單獨(dú)重建而列表部分完全不參與。6.2 AnimatedBuilder / ListenableBuilder 的局部刷新策略我最終用的是 ListenableBuilder等價(jià)于 AnimatedBuilder來(lái)包裹視差層把 ScrollController 掛為監(jiān)聽(tīng)的 Listenableclass _ParallaxLayer extends StatelessWidget { const _ParallaxLayer({ required this.controller, required this.child, required this.opacityFactor, }); final ScrollController controller; final Widget child; final double opacityFactor; override Widget build(BuildContext context) { return ListenableBuilder( listenable: controller, builder: (context, _) { final pixels controller.offset; return Opacity( opacity: (1 - pixels / 260).clamp(0.0, 1.0), child: Transform.translate( offset: Offset(0, -pixels * opacityFactor), child: child, ), ); }, ); } }推進(jìn)這個(gè)方案后背景層自己監(jiān)聽(tīng)滾動(dòng)并重建列表部分在滾動(dòng)時(shí)完全不 rebuild。這樣幀耗時(shí)從 22ms 降到 9ms低端機(jī)上穩(wěn)定 60fps。這也是我強(qiáng)烈推薦的方式讓滾動(dòng)驅(qū)動(dòng)的 UI 小顆粒自管理而不是讓整棵頁(yè)面樹(shù)陪跑。6.3 實(shí)測(cè)數(shù)據(jù)幀耗時(shí)與內(nèi)存占用對(duì)比我做了一組對(duì)照測(cè)試頁(yè)面結(jié)構(gòu)一致都在低端 Android 上列表 80 項(xiàng)頭圖大小約 500KB各測(cè) 10 次滾動(dòng)操作取平均方案幀耗時(shí)ms掉幀數(shù)/10次滾動(dòng)內(nèi)存增量MB整頁(yè) setState22.4628ListenableBuilder 局部重建9.1019ListenableBuilder RepaintBoundary8.7017加 RepaintBoundary 之后收益并不大原因是 Opacity 和 Transform 本身已經(jīng)是圖形層級(jí)的操作底層的渲染層已經(jīng)被 Flutter 隔離得很好了。RepaintBoundary 更適合的場(chǎng)景是有一個(gè)非常貴的子組件比如大圖或復(fù)雜文字排版且它自身不參與視差移動(dòng)這種場(chǎng)景下把它獨(dú)立成一層可以避免它和背景層合成時(shí)反復(fù)重繪。內(nèi)存方面最大的變量還是圖片緩存和布局方案關(guān)系不大。但我有一個(gè)經(jīng)驗(yàn)視差背景圖因?yàn)闀?huì)被拉伸和位移盡量不要用超大原圖壓縮到 1080p 寬度足以覆蓋主流手機(jī)屏幕還能省掉不少 GPU 內(nèi)存。另外我建議在真機(jī)上測(cè)試時(shí)直接開(kāi)啟 DevTools 的性能覆蓋層實(shí)時(shí)的網(wǎng)格線(xiàn)能一眼看出是哪一幀超了。當(dāng)幀耗時(shí)穩(wěn)定在綠區(qū)16ms 以?xún)?nèi)時(shí)再去做優(yōu)化收益分析不要一上來(lái)就抱著 RepaintBoundary 到處貼先排查 rebuild 范圍才是性?xún)r(jià)比最高的做法。6.4 我在調(diào)優(yōu)過(guò)程中驗(yàn)證過(guò)的兩個(gè)小技巧處理滾動(dòng)驅(qū)動(dòng)的動(dòng)畫(huà)時(shí)Canvas 合成階段也有兩個(gè)容易被忽視的細(xì)節(jié)。第一個(gè)是避免在動(dòng)畫(huà)過(guò)程中修改父級(jí)容器的布局尺寸比如根據(jù)滾動(dòng)位置動(dòng)態(tài)改變 Sliver 區(qū)域的高度。這會(huì)導(dǎo)致引擎在這一幀觸發(fā) relayout 而不是只重繪成本高很多。正確的思路是布局尺寸保持固定只通過(guò) Transform / Opacity 改變視覺(jué)表現(xiàn)任何尺寸動(dòng)畫(huà)都放到動(dòng)畫(huà)控制器里做不要直接綁定滾動(dòng)位置。第二個(gè)是列表項(xiàng)在滾動(dòng)過(guò)程中不要頻繁創(chuàng)建新對(duì)象。SliverChildBuilderDelegate 的 builder 里如果每次滾動(dòng)都 new 一個(gè) EdgeInsets 或 BoxDecorationDart 對(duì)象暴漲會(huì)觸發(fā)頻繁 GC引發(fā)隨機(jī)卡頓。我習(xí)慣把不可變的樣式抽成 const 或 top-level final讓 builder 只組裝引用不創(chuàng)建新實(shí)例?;氐竭@個(gè)項(xiàng)目的整體體驗(yàn)視差滾動(dòng)加沉浸式布局的完整組合在鴻蒙設(shè)備上驗(yàn)證通過(guò)后另一個(gè)讓我印象深刻的點(diǎn)是交互上不要過(guò)度用力。我最初的版本給列表正文也加了 1.3 倍速的位移結(jié)果用戶(hù)在閱讀時(shí)總覺(jué)得文字搶跑后來(lái)把正文速度改成 1.0、只保留背景層 0.3 倍速后觀感反而自然很多。所以這些速率的微調(diào)真要在真機(jī)上一遍遍試模擬器上是體會(huì)不到那種頭圖緩慢退場(chǎng)、正文徐徐展開(kāi)的節(jié)奏感的。最后再分享一個(gè)排查技巧如果你在調(diào)試視差滾動(dòng)時(shí)發(fā)現(xiàn)頁(yè)面卡住了或者動(dòng)得不對(duì)先不要懷疑是 Sliver 的問(wèn)題打開(kāi) debug 模式在滾動(dòng)時(shí)打印 notification.metrics.pixels 和 controller.offset確認(rèn)你監(jiān)聽(tīng)的滾動(dòng)源是不是同一個(gè)。我在項(xiàng)目里就是因?yàn)?header 下部放了一個(gè)橫向 PageView它的滾動(dòng)通知被 NotificationListener 捕獲導(dǎo)致縱向滾動(dòng)量被橫向滾動(dòng)干擾產(chǎn)生了詭異的偏移跳變。解決辦法是在 onNotification 里判斷 notification.metrics.axis Axis.vertical把橫向滾動(dòng)通知直接過(guò)濾掉。這類(lèi)滾動(dòng)源串?dāng)_的問(wèn)題排查起來(lái)特別費(fèi)時(shí)建議一開(kāi)始就按 axis 過(guò)濾省得后面返工。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99啪啪| 久久噜噜噜精品国产亚洲综合| 高潮嗯啊性感美女久久久| 香蕉久久AⅤ...| 超碰97 线线 在现| 亚洲诱惑天堂 | 色五月婷婷色| 日韩人妻制服丝袜av| 老鸭窝成人免费毛片视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 香蕉99秘 一区精品蜜桃臀| 狠插 制服 自拍| 日本熟女中文| 国产aⅴ无码片毛片一级网站| 色九久| 色天使AV天堂| 99亚洲人人| 久久久噜噜噜久久久| 日韩性爱网址| 91天堂色男人的天堂| 国产超碰AV在线精品| 精品超碰色| 久久亚洲天堂| 狠操91,com| 78久久久| 亚洲 图片 欧美 色图| 天美传媒一二三区永久网站| 久久99视频| 国产精品探花在线| 久久久久久国产手机AV| 久久久久国产一区二| 老司机老司机午夜影院| 最新中文字幕在线亚洲| 思思热久久成人| 日韩免费三级黄片电影| 国产精品久久妻无码网站| 亚洲中文字幕在现观看| 欧美v亚洲v综合v国产v妖精| 在线观看黄色电话| 免费毛片在线播放| 日韩情色AV| 久久超碰亚洲人| 一本正道久久熟女| 欧美午夜色妇色鬼| 欧美在线啊啊啊| 四季AV一区二区凹凸精品小说| 欧美 亚洲 大香| 97在线观视频免费观看| 乱色老一区二区三区的观看方式| 久九9精品| 99久久9| 亚洲骚男同com| yazhououmeizongya| 麻豆区久久久久亚| 美女黄色91| 久9精品| 四虎精品永久在线播放| 搡老熟女老女人老熟妇免费视频| 十八禁啪啦拍视频无遮挡| 亚洲久热| 天天干天天日天天射黄色大片| 99999久久久久9国产精品| 久无码| 2017大香蕉国产精品久久| 久热99999| 九九九九精品| 永久免费发布性爱网| 精品国产人成在线| 六九九九| 成人一区二区三区四区| 91bbbbbb| 国产精品成人无码av无码免费| 曰韩av中文字幕专区| 亚洲情色电影网| 欧美综合网1| 狠狠躁伊人中文字幕| 91欧美亚洲| 国产av激情无码久久天堂| 乳欲人妻办公室奶水| 婷婷亚洲综合| 久久骚| 夜夜爽夜夜| 亚洲成A∨人影院在线欢看| 久久综合18p| 蜜桃传媒视频第一区入口在线看| 国产精品第一区第一页| 91精品久久久久久综合五月天| 精品少妇一区二区三区免费观看| 91操人| 天天日天天干天天操| 欧美午夜视频精品久久| 很狠操| 亚洲九九九| 欧美日韩国产中文超碰| 欧美成人精品一区二区男人蜜臀| 国产家庭乱伦表演| 91美女视频在线免费观看| 大粗鳼巴久久久久| 久久精品一区二区三区不卡| 日韩淫色网| 东北少妇高潮zzzz| 97久久国产| caoni国产亚洲av| 美腿色图| 久久大黄片| 色综合九九| 色阁阁AV综合网| 日韩精品资源专区二区| 欧洲Au麻豆| 欧美日韩在线小说 | 青娱乐久久艹| 好爽免费视频,| 国产又黄又爽| 丝袜熟女2P| 男人的天堂VA| 男女91| 精品国产一区探花在线观看| 天操天操夜操夜月操月年年操| 久久久极品| 黄色性爱网网| 97人人夜| 久久亚洲骚逼综合| 精品无码一区二区三区| 日夜久久久九九九久| AV乱伦国产| 欧美制服网站美腿丝袜| 岛国小电影| 97狠狠| 国产玖玖| 人人贴人人摸| 亚洲欧洲激情| 五月天婷婷影院| 欧美亚洲丝袜人妻制服中文99| 韩国黄色片精品久久久| 亚洲国产97在线精品一区| 色色婷婷丁香| 中文字幕人妻资源在线| 婷婷丁香一区二区三区| 亚一综合久久久久久久久久| 色综合99999| 艹精品| 亚洲 无码 有码 中文字幕| 凸凹视频在线观看| 男人的天堂久久久| 黄资源| 日本性爱少妇| 女人久久久| 青娱乐亚洲热| 色欲蜜臀AV| 国产精品一二三| 在线99热| 久久精品中文字幕无码l| 国产精品久久久久久9999| 久99视频| 久久精品中文字幕观看| 亚洲中文字幕一区二区| 精品无码一区二区三区| 一本大道久| 屌逼传媒| 国产精品久久久久久久黄无码| 97在线日韩中文字幕| 日日夜夜天天| 丰满人妻一区二区三区四区| 日韩兔费看黄片| 大香蕉啪啪啪啪在线| 5278欧美一区二区三区| 欧美区亚洲区偷拍区| 中文字幕人乱码中文字的预防方法 | 国产人妻精品久久久一区二区三区 | www网站黄| 张柏芝国产一区在线观看| 久久久久元码视频| 亚洲 日本 一 二 三| A片大香蕉在线| 97超碰这里只有精品| 口爆综合网| 美国一区二区三区视频| 91 欧美| 久久后入制服| 夜夜 中文视频rt| 性吧在线视频| 丁香九月激情啪| 香伊人在线| 啪啪啪综合| 九九九九免费视频| 91欧美综合在线| 狠狠干,狠狠操| 人人干人人搞人人摸| 情色日播放AV| 999国产精品999久久久久久| 自拍内地三级在线观看| 麻豆天美传媒在线视频天堂| 九99久久| 久草看看看| 日本精品高清一二区一本到| 亚洲综合骚逼| 逼逼逼逼操操操操操操操操操午夜剧场| 天天综合网1| 久久9亚洲| 蜜桃久久一区二区三区| 26uuu成人影片| 97综合国产| 少妇蹲下买菜露大唇0| 久草新免费| 久久不卡一区二区| 强上我不卡卡| 久久欧美按摩999| 狠狠综合网| 亚洲免费看片| 五月激情视频| 色噜噜狠狠色综无码久久合欧美| 国产区性爱在线视频秋霞豆 | 日本不卡三级网在线播放| 亚洲欧美成人在线| 国内外色色色色色成人视频| 久久久网站| 日韩欧美视频青青| 人人操天天爽| 综合av影片| 蜜桃视频成a人v在线| 麻豆九九九| 婷婷97| 四虎影视国产精品| 欧美日产国产在线成人第一区| 视频一区二区三区精品| 影音先锋视频在线| 囯戸精品高潮呻吟旡码| 曰本道人妻久久久在线不卡色视频| 密臀视频三区免费网站| av操操不卡| 九99久久| 日韩一区二区高清在线观看的| 欧美色综合| 国产麻豆福利av在线播放| 黄色高清无码无码破解免费暗网| 婷婷激情五月| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 日韩av电影成人在线| 国产精品免费1区2区视频| 日韩乱中文| 国产欧美日韩女同性恋ww喷水精品| 久久9精品视频| 精品久久久久成人码免| 色噜噜国产精品视频一区二区| 精品一区二区三区国产| 性色av婷婷久久一区二区点复制| 婷婷亚洲中文字幕在线| 久久久精选| 激情抓乳插进去啪啪啪日韩| 人妻天堂综合网| 久久久久国产精品人妻aⅴ天堂| 中文字幕艹艹| 大香蕉97久久| 一级AV性爱| 青青草精品| 国产精品一区二区在钱播放| 伊人欧美大香蕉视频| 久久久久久久9| 韩国三级一线观看久| 欧美亚洲第一页| 黄色一级视| 亚州宗合另类| 精品人妻视频一区二区在线播放| 亚洲综合20p| 中文日本免费高清| 北京专精特新企业招聘信息| 亚洲做性| 无码天天操| 伊人亚洲国产一成人久久精品,久久| 亚洲人在线成线成人| 亚州国产成人精品女人久久| 囯产精品久久久久久久久久梁医生 | 十八禁视频网站| 怡红院怡春院| 另类图片综合| 婷婷五月天福利| 欧美91精彩| 超碰午夜| 欧美毛片在线网| 天美传媒精品一区二区三区| 在线观看无码三级少妇| 密臀在线免费观看| 凹凸视频在线一区二区| 1024香蕉视频| 熟女熟妇一区二区三四区| 不卡一区二区日本视频| 久久蜜色情在线视频xxx免费观看| 97在线/亚洲| 99久久e免费热视| 曰本熟女视频| 91亚洲色人| 亚洲精品丝袜-不卡成人免费…… 久久久久成人蜜桃精品 | 色网综合网| a亚洲欧美色欲| 97超碰色五月| 欧在线一二区| 青青国产精品在线| 2020中文字幕在线观看| 人妻少妇视频在线播放| 久久久96| 久久人人爽爽爽人久久久| 少妇久久久久| 97AV爱| 精品一级毛片在线观看| 超碰人妻中文在线| 国产精品爽爽v| 青青草色插素人| 国产精品麻豆成人av| julia在线观看久久| 亚洲色天| 亚洲色香| 国产亚洲禁久一区二区| 精品国产乱码久久久A| 五月丁香啪啪网| 9美女超碰在线免费观看| 婷婷五月天色| 国产一区二区三区白丝| 欧美综合色| 九九黄色网| 国产精品高潮久久久无码| 毛片中心9视频99| 天天日天天搞天天干| 亚洲青青草| 天天天天天干夜夜夜夜夜操| 久久人妻| 中文熟女五十乱码在线| 亚洲精品视频二区| 久久精品毛片免费不卡| 欧美色综合网| 蜜臀99999| 久久久九九网站| 另类天堂| 国产97色在线 | 亚洲| 神马久久久久眼| 欧美一区二区日韩三区| 一二区在线观看视频| 欧美大香蕉在线观看| 成人一级性爱| 欧美姓爱综合网| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲午夜未满十八勿入网站日本又色又爽又黄| 2017大香蕉国产精品久久| 激情久久av一区av二区av| 中文字幕乱码在线| 91国产丝袜美女| 久操综合在线| 日韩性爱电影一区| 国产美女口爆吞精视频| 曰本精品久久久| 无遮挡猛进视频免费无限观看| 大色综合| 亚洲欧美洲综合| 97AV在线免费观看| 99久久无色码| 亚洲综合在线视频| 97人妻免费中文字幕| 91无遮挡| 揉揉日日日日| 欧美亚洲在线| 美女黄码视频午夜| 久久e6只有精品| 26uuu性| 国产AV线| 亚洲色悠悠久久88| 蜜伊人色综合97| 极品尤物在线观看| 亚洲97久久精品亚洲| 久艹日日日| 嗯~啊~轻一点 视频| 小骚逼被操的爽不爽| 超碰久久性爱| 爽爽歪在线视频| 色5月婷婷| xxx0国产在线播放| 国产精品蜜臀久久久久无码AV| 91精品国产91熟女| 欧美综色欧| 天堂综合| 美女爽爽爽刺痛洞洞| 久久鲁夜| 欧美日本天堂| 亚洲一本色码中文字幕| 在线观看中文字幕| 91夜色| 国产日本顶级一区二区三区| 五月天精品| 国产精品久久久久久久久久二区三区| 久久久久久裸体| 亚洲色图国产另类| 青青草色插素人| 夜夜福利| 九九九九免费视频| 精品人妻视频一区二区在线播放| 日韩精品影视| 成人怡红院| 久久精品国产亚洲5555| 91色人妻| 国产92麻豆天美精品色欲5| 久久精品中文字幕无码l| 黄色网址在线免费观看| 国产精品国产拍高清AV| 女人天堂AV五区在线| 天天色香欲综合网| 欧美后入视频| juliaann欧美丝袜办公室| 亚洲资源站| 久久久久久亚洲Av无码精| 91性高朝久久久久久久久| 日韩免费看在线黄色片| 特级毛片特黄久久免费看| 无码高清操逼网址| 国产中文字幕曰本毛片| 熟妇熟女视频一区二区三区| 国产夫妻一区二区| 久久高清无码夜夜操| 青青草公开在线免费不卡视频| www亚洲欧美| 天天射夜夜操| AV无码久久久精品| 亚洲91av| 一级黄碟| 福利视频香蕉免费一区二区在线| 亚洲日韩美国人妻| 操操AV电影| 四虎免费看黄| 精品九九九九九| 小视频玖玖| 污啪啪啪视频| 亚洲综合 欧美| 日本韩高清无砖码22o| 操逼免费视频无码国产| 精品国产乱码久久久A| 欧亚无码视频| 五月丁香色婷婷| 操b网站亚洲无码| 欧美人妖内射| 日本免费专区| 嗯嗯嗯啊啊啊操的我好爽| 91色综合色| JIZZJIZZ亚洲女人被躁| 国产免费一区在线观看| 91激情网| 伊人网青青| 开心五月天激情网| 免费草草草草草视频| 国产精品美女久久久久久网站| 亚洲古典另类欧美在线| 久久綜合很很很| 亚洲影视综合| 五月丁香| 天天综合网~91| 国内毛片婷婷六月色| 日本裸体久久色噜噜| AV色女综合| 在线精品福利免费播放| 999 久久久| 婷婷婷婷婷婷久久久久| 婷婷五月天网| 亚洲双插| 丁香六月婷| 亚洲欧美变态| 免費黃色視頻觀看一| 97这里只精品| 国产熟女乱论| 麻豆天美在线喷水AV| 成人av在线播放| 中文伊人大香蕉视频| 欧美92| 日韩人妻少妇 一区二区三区| 377p欧洲日本亚洲大胆| 久久国产对白激情浪潮| 内射夫妻三片| 操B久久| 日韩三A大片在线观看| 久久9精品视频| 男人天堂网站| 亚洲综合另类欧美久久久| 日韩啊V| 女人一区| 亚洲国产尤物yw在线观看| 久久只有精品一区二区三区| 中字幕人妻一区二区三区| 日本免费不卡二区| 久久精品国产99精品亚洲蜜... | 手机午夜电影神马久久| 精品人妻一区二区免费蜜桃| 亚洲精品一区二区精品| 亚洲电影91| 99热只有这里有精品| 国产丁香精品露脸视频| 女人的久久久| 色色网91| 91 亚欧| 亚洲欧美校园另类春色| www.亚洲黄色| 亚洲AV在线资源| 精品婷婷| 亚洲无码精品AV久久久| 91丝袜美腿片| 狠狠干综合| 久久91| 午夜精品久久久久| 久久婷婷色| 亚洲av青草久久一区二区| 求求你操操我| 狠狠操综合| 精品综合久久久久久五月天| 传媒免费一区二区三区| 999国产精品999久久久久久| 91neishe| 国产精品无套内谢| 中国人高清www色视频免费| 色五月第四色| 裸体美女免费看网站青草| 内射小黄片| 欧美亚洲韩国视频十五区| 国产精品情侣啪啪| 囯产操逼片| 精品国产乱码久久| 亚洲97网站| 日韩精品三区四区| 人妻-91porn| 欧美人人操人人插| 97在线观| 人妻大香蕉| 欧亚不卡| 亚洲青青青视频在线| 亚洲一区二区中文字幕| 91精品微拍福利| 先锋女优在线观看视频| 亚洲第二页| 欧美猛交黑寡妇中文字幕| 九九热最新| 日本一区二区不卡精品| 内射小黄片| 欧美性暴力| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲 一区二区 自拍| www国产无码| 少妇大屁屁| daxiangjiao你懂的| 欧美成人亚洲精品| 91狠狠综合久久久久久| 婷婷伊人| 国产精品成人在线| 人人干人人操人人..com| 亚洲精品白浆高清久久久久久| 亚洲资源站| 东京热91| 91情色在线| 激情视频图片| 亚洲猛交| 青青草中出视频 | 好色美女九七第一页| 欧美夜夜狠| 热99这里只有精品| 日本一级二级三级网站| 亚洲五码一区二区三区| 淫荡少妇免费| 婷婷午夜成人色中色| 亚洲激情综合另类男同| 日本操逼视频不卡直接放| 久久精品一区二区一8| 97免费视频在线| 青青操国产夫妻| 96久久久久久久| 91老司机精品| 91性网| 干B网| 99999re| 秋霞Av理论一级在线| 亚洲男人天堂网| 性无码专区2020| 亚洲成人黄色在线观看| 欧美呦呦性爱| 黑人操一区二区| 中文字幕精品区先锋资源| 人人做人人妻人人夜视频| 亚洲欧美激情在线视频| 亚洲丝袜二区| 91色黑人少妇| 日韩精品电影| 亚洲精品国产拍免费91在线| 97手机日韩| 天天做天天爱夜夜爽毛片试看| 一级二级三级黑人无码| 欧美专区日本专区| 小少妇| 久久只有精品一区二区三区| 日韩一级二级三级免费看完整版国语版| 91国产在线精品| 国内精品久9| 青青草国产欧美非洲黑人| 四虎国产精品永久入口| 最近2019中文字幕国语免费版| 国模精品娜娜一二三区| 中文字幕加勒比海高清无码免费视频| 婷婷15月天青娱乐| 9丨久久九九九| 日韩免费高清大片在线| 国产动漫操逼视频| 久久久久久久78| 久草毛片| 午夜操逼不卡| 亚洲AV小说| 2026国产精品视频| 久草加勒比一区在线| 思思热在线cao| 天美AV片| 啊啊啊 在线| 国产亚洲欧美每日在线| 色99在线| 天天综合麻豆视频| 日本国产欧美一区三区二区| 欧美啪啪女女| 亚洲涩涩| 精品国产av一区二区三区四区入口| a天堂视频| 国产精品久久9| 亚洲中文sv| 欧美极品性爱天天射| 91国产精品熟女| 精品二区久久| 综合欧美激情网| 综合久欧洲| 骚女天天综合网| 日韩精品在线观看网站| 诱惑人妻欧美一区在线播放| 啊啊啊好想要| 久久久婷| 国产精品午夜福利| 黄色性爱网网| 内射中国少妇高清视频免费视频 | 人妻啊啊人妻啊| 久久久精| 日韩精品在线观看网站| 欧美与日韩97| 中国国产精品一区视频| 18岁禁 茉莉成人久久| 懂色Av| 色av中文字| 精品一区二区三区麻豆| 99色在线| 性色A∨91| 嗯嗯啊啊视频在线看| 亚洲图片视频小说| 中文字幕在线观看视频www| 天天天做天天天爱天天天爽| 久久九九视频九九视频| 色超碰综合| 99国产在线 精品 视频| 久久大陆| 国产精品香蕉热久久新品| 物业黑人 AV一区| 懂色AV蜜臀无码精品APP| 久久人妻少妇| 欧美日韩性爱操大逼| av久日| 九九黄色视频在线观看| 欧美色91| A V少妇特黄三级| 国产精品久久久| 亚洲综合另类欧美久久久| 四虎国产精品永久在线囯在线 | juliaann欧美丝袜办公室| 激情综合五月婷婷| 色九久| 国产日本熟女顶级一区二区三区视频| 久久大| 免费看污网站| 在线播放一级无码视频| 天堂网 主播 亚洲| 丁香六月婷婷综合| 久久久久国产精品久久久| 91丝袜美女| 亚洲精品国产熟女| 婷婷九月丁香| 国产天美欧美| 国产成人无码啪| 久久久久久人| 亚洲精品一二三四区| 欧美日本中字另类在线| 无码粉嫩白虎一线天b区| 欧美不卡在线美女| 91久久精品中文字幕| 午夜噜噜噜| 亚洲蜜臀懂色| 亚洲操逼网| 影音先锋日本乱伦| 欧美BT 亚洲色图| 91精品电影18| 另类 日韩 熟女| 亚洲综合首页| 人妻无码一区二区三区久久99| 激情五月激情综合网| 国产久久成人| 91丝袜在线播放| 午夜综合在线| 一牛影视久久久一区二区三区| 青娱乐国产盛宴视频| 欧美色人| 麻豆天天躁天天揉揉AV| 日韩电影天堂视频二区三区| 婷婷在线播放| 岛国AB视频| 五月婷婷激情综合| 99这里只有精品国产| 精品人妻高清麻豆av| 中文字幕av久久爽Av| 九九RE视频在线精品| 中国农村熟妇毛片视频| 精品免费囯产一区二区三区| 日韩精品9区| 人人色人人射人人妻| 亚洲AV无码乱码在线观看性色| 无码久久亚洲高清,| 国产精品久久泡妞网站| 97超碰色中文字幕| 欧美日本天堂| 91扒丝袜综合在线| 在线黄页看毛片| 国内精品伊人久久久久影院会| av一区二区三区四区| 欧美激情激情xxxx欧美专区| 南澳成人一级片在线播放| 少妇人妻激情四射| 天天澡天天爽日日av| 玖玖97综合 | 97在线观看免费视频l| 岛国小电影| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 天天插天天射| 免费看一级a性色生活片久久无| 中国zzijzzijzzwww精品| 沈阳熟女高潮对白视频| 狠狠91| 97国产人人| 精品福利| aV中亚| 成人小说另类在线| 亚洲婷婷丁香在线| 日本熟妇浓毛hdsex| 久久9久| 久久精品人妻一区| 欧洲在线性爱视频| 久久大香蕉手机高清| 97久久视频| 99精品网| 黄色大片一区二区密桃丝袜| 无码91| 青青草吊丝| 91色综合激情| 一区,二区,三区视频| 亚洲资源网| 日韩欧美天堂| 欧美九九九| 97视频在线免费观看| 少妇被c 黄 免费观看| 欧美一区二区男人天堂| 蜜乳成人AV| 欧美色性爱| 人妻AV在线| 国模限制级电影| 97se综合网| 亚洲男人的天堂网| 亚洲第一男人天堂| 精…码一二三区| 性色AV蜜色av色欲av| 国产强奸乱伦xd| 久久九九国产精品| 一区二区 韩日AV| 91色综合激情| 亚洲综合伊人| 成人怡红院| 天天色天天干天天爱| 囯产乱伦一区二区三女 | 91色插| 一个人免费视频观看在线WWW| 色色色色日本| 精品少妇一区二区三区在线视频| 久久精彩视频| 天天天天天天天天综合| 欧美少妇高潮视频| 强奸乱伦免费网站| 五月天激情影院| 欧美爆操91| 亚洲,欧美,综合网| 国产精品黑人一区二区三区| 国内自拍 日韩激情 99| 久久久久久亚洲精品中文字幕人妻| 色综合久久夜色精品国产天堂| 91日韩网站| 成人97人人超碰人人| 日本久久精品| 歐美性天天| 91殴美| 午夜偷拍久久熟女| 97蜜桃综合| 97人人爱人人乐| 五月丁香拍拍激情综合三级| 四虎永久在线精品免费网址| 春色综合免费| 天天草夜夜草高潮片| 天美av在线观看| 国产精品对白自产拍| 免费自拍三级综合| 亚洲欧美一区二区三区在钱蜜桃| 综合激情一一91| 国产精品久久天天干| 丁香激情五月| 国产乱码久久久| 精品国产丝袜一区二区三区乱码| 欧亚洲精品有视频| 狠狠入| 91干熟女| 日本精品九九九| 91亚洲网| 男人的天堂不卡一区二区| 亚洲男人天堂视频| 韩国黄片aaaa| 亚洲第一二区另类图| www.av家庭乱伦| 嗯啊不要在线| 伊人网高清| 五月婷婷大香蕉| 99热在线只有精品| 精品人妻美妇91job| 狠狠爱夜夜干| 亚洲五码一区二区三区| 涩涩久久精品| 亚洲导航深夜福利| 亚洲天堂美臀在线| 色色色欧美| 国产1727欧美| 无码国产精品久久久久| 风月影院男女十八禁| 黄片视频,下载| 国产农村妇女精品一二区| 日韩综合无码一区久久92| 96AV精品| 强奸乱伦 亚洲一区| 热天堂一区二区| 日本精品中文字幕视频| 日韩钢筋无码高清啾啾啾| 性饥渴少妇av无码毛片| 狠狠亚洲| 久久性爱大全| 久久久青青草| 97精品免费| 99re这里只有精品中心播放| 蜜臀久久99精品久久久久久婷婷 | 校园春色五月天| 操九九九九九九| 人人操人人插 - 百度 - 百度| 97综合国产精品高潮久久| 在线观看无码三级少妇| 国产精品国产| 99视频内射三四| 97在线免费| 激情终合网| 国产亚洲日本精品在线| 少妇高潮一区二区三区在线| 嗯嗯啊啊视频在线看| 性色AV蜜色av色欲av| 超碰久久草| 国产成人综合网| 色欲天天综合久久久无码网中文| 骚逼一区二区| 亚洲国产欧美中日韩成人综合视频| 操熟女91| 日日夜夜草草草| 中日高清无码操逼视频| 91美女网站| 97超视频在线观看| 久久丁香| 久久精品国产99精品亚洲蜜... | 99无码视频| 9丨亚洲一区二区在线| 亚欧美综合| 久久久久久中文字幕中文字幕最新| 波多野结衣一级视频| 少妇高潮九九九九九九九| 美女在线H91| 亚洲欧洲国产综合av| 日韩综合无码一区久久92| 久久99深爱久久99精品| 日本91白丝| 青娱乐国产精品| 久久久久亚洲Av无码专区老牛影视| 激情人妻另类| 欧美在线伊人色| 精品人妻美妇91job| 1000部熟女视频在线观看| 九九久精品| 97超碰资源网| 熟妇人妻一区二区三区| 国产精品99久久久www| 一个色导综合| 亚洲欧美色图片| 亚洲欧美天| 日韩电影天堂视频一区二区| 淫淫总合网| 色婷网| 欧亚性爱啪啪| 精品国产一区二区三区四区在线看 | 日韩成人私密一级精品av| 国产自偷| 加勒比伊人综合| 日本一片一区| 欧美大香蕉在线观看| 精品久久99| 激情干在线| 四虎影视永久在线免费| 亚洲啪啪视频免费| 欧美在线播放| 成年人黄色| 欧美亚洲系列| 亚洲精品 欧美97色色| 人人操人人射人人干| 天天夜夜久久| 国产婷婷一区| 九九久久久九九| 午夜精品一区二区三区三上悠亚| 717影院理论午夜伦八戒| 精品中文字幕一区二区l - 百度| 免费福利视频中文字幕| 成人免费视瓶| 亚洲精品自拍| 成年人黄色视频免费| 人人操人人摸人人骑| 久久一区二区三区四区五区| 亚洲中文字幕熟女少妇一区二区| 999国产精品999久久久久久| 密臀国产在线| 中韩中文字幕在线观看| 青草伊人网| 一二三区视频在线观看| 亚洲综合在线91| 国产sv美女内射| 99av| 精品人妻中文字幕高清| 久久夜夜| 亚洲av国产av综合av卡| 国产精品久久久久久久AV大片| heyZO天然素人无码AⅤ专区| 一本精品日本在线视频精品| 人妻啪| 99精品久久久久久久婷婷| 麻豆国产96在线| 五月天婷婷色色| 日本在线不卡123| 韩国轻伦国内自拍一区| 熟女欧美日韩综合婷婷| 欧洲大香蕉| 国产人妻久久精品一区二区三区| 天天综合色图| 国产在线能看的你懂的| 久久精品中文字幕观看| 伊人黄色视频免费观看| 丁香五月激情网| 嗯~啊~快点 死我视频| 欧美在线55555| 欧美综合色综合| 9久久久久| 国产多人在线观看视频| 国产91久久九九免费精品无码| 337p大胆噜噜噜噜噜91Av| 东京太热久久久| 一区二区不卡| 亚州,欧美在线| 大JI巴好深好爽又大又粗视频| 岛国福利在线精品播放| 国产伦乱91| 91肏屄网| 91女优在线观看 | 色色色色综合网| 欧美色图片91| 色综合1991| 欧美性xxxxx狂欢| 亚洲日韩美国人妻| 伊人AAA| 亚欧美综合网。| 97超碰香蕉| 精品高清一区二区三区三州| 欧美在线干| 1区2区3区中文字幕日韩| 99草精| www.伪伪| 色av中文字| 久久噜噜噜精品国产亚洲综合| 欧美色偷偷| 久久一区二区三区入口| 精品人妻一区二区免费蜜桃| 五月天九九日国产精品一区二区三区| 国产精品内射婷婷一级二| 天天躁日日躁AAA片李宗瑞| 歐美一級亂黃99在綫精品| 成人夜夜| 天天操天天干一区二区 | 亚洲欲| 熟女乱3伦999| 丁香五月激情综合| 久久一区二区加油站| 精品国产三级av韩国在线| 日本99久久| 超碰一区二区| 琪琪精品免费一区二区三区| 欧洲天天在线| 综合色欧美| 国产欧美亚洲精品a第2页| 91激情网| 自拍偷拍草一草| 97干在线看| 青青草中文字幕| 色婷视频| 亚洲第一页综合在线| 约操熟妇| 日影院久久婷婷夜夜网| 欧美爱三级日韩久久| 97综合在线观看| 大香蕉中文| 少妇二级| 亚洲久久久| www.天天干| 99热销国产这里有精品| 亚洲国产欧美中日韩成人综合视频| 日韩精品电影| 一级片在线观看高清无码| 久久久久久久久久久久久久久乱码| 中文久久久| 天天狠| 又大又大又大又粗爽高潮观看| 五月丁香大香蕉| 91美女精品| 天天做天天爽| 日韩情色一区二区| 这里只有精品久久| 亚洲欧美日韩不卡人妻| 婷婷六月色| 97免费在线观看| 日本 成 人 小说 电影 一区二区| 精品97久久| 久久亚洲影院一区二区| 亚洲美女av无码| 九九久久一区二区三区| 操逼无码操逼| 成人热久久精品| 大黄片做爱的大的| 色偷偷人人玩人人舔人人操人人摸人人爽 | 91成人久久| 人妻少妇精品无码专区二区密桃| 黄片直播三级黄片两女一男| 青青久日| 天美传媒一二三区永久网站| 91久久青青草原精品| 艾草av| 中国乱伦一区二区| 老鸭窝成人| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 99热99re超碰精品| 欧美一级AAAAAAA| 九九av| 久操大香蕉| 国产色产精品在线观看| 青草香蕉网| 亚洲一本大道中文字幕无码在线| 欧美草草高清日韩视频| 日本久操视频| 午夜AV人气不卡| 97精品人妻一二三四| 98色网| 性爱Av免费| 蜜桃久久一区| 天操天操夜操夜月操月年年操| 爽极品影院| 91丰满| 啊啊啊啊啊好大好舒服想要| 中文字幕成人理论在线| 人人天天欧洲| 蜜乳AV.COM| 激情另类激情| 佐山爱中文字幕| 成人性爱电影一区二区| 一区二区乱码福利| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 国产亚洲精品第一最新| 人妻天天爽天天爽三区| 国产精品久久久久999| 欧美综合站| 岛国网址国产| 91一区二匹| 久久久九精品| 欧美久久婷| 蜜乳av首页| 久久久久免费看少妇A片特黄| 性欧美| 精品一区二区三区四区女| 丁香九月激情| 国产野战露脸在线播放| 精品1区2区3区| 好屌色综合| 欧美|91色综合| 欧美日韩岛国大片在线观看| 色欲Av人妻精品一区二| 97资源站日韩| 亚州Av天美传媒| 台湾佬中文娱乐自偷自拍| 在线99热| 女人喷水视频在线观看| 成人av毛片在线观看| 色五月av| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 狠狠干,狠狠操| 天天做日日做天天欢。| 都市久久精品激情亚洲| 999综合网| 国产丝袜啪啪| 亚州精品人妻一二三区| 久久99草| 国产精品欧美激在线| 国内精品不卡无毒99999| 激情开心五月天| 天天躁日日躁AAAXX| 午夜寂寞欧美| 乱伦Av网| 约操熟妇| 精品亚洲国产成人精品| 成人无码在线超碰网| 91网九色蝌蚪操熟女| 欧美色网| 激情专区综合| 乱伦日本色图AⅤ| 韩国黄片aaaa| 黄色AAAAA欧美| 亚洲日本激情| 久久久久久久九九九九九九| 久久久性| 综合另类| 欧差乱伦二三| 国产精品一区二区a| V A在线| 日本欧美中文字幕| 中文操逼字幕| 在线毛片片免费观看| 操逼无码操逼| 蜜臀AV秘一区翔田千里| 欧美性生活男人的天堂| 日本精品一级二级三级| 成人小说另类在线| 91av一区二区在线观看| 中国一级特黄大片护士| 亚一综合久久久久久久久久| 欧美大香蕉同搞| 首页中文字幕中文字幕免费| 欧美久久伊人| 狠狠色综合网| 亚洲男人天堂2019| 91亚洲青青草原精品1区| 亚洲欧美爆| 婷婷香网站|