日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

左右拖動切換圖片效果案例

來源: 責編: 時間:2024-03-18 09:40:45 168觀看
導讀想了解更多關于開源的內容,請訪問:51CTO 鴻蒙開發者社區https://ost.51cto.com介紹本示例使用滑動手勢監聽,實時調整左右兩側內容顯示區域大小和效果。通過綁定gesture事件中的PanGesture平移手勢,實時獲取拖動距離。當拖

tkm28資訊網——每日最新資訊28at.com

想了解更多關于開源的內容,請訪問:tkm28資訊網——每日最新資訊28at.com

51CTO 鴻蒙開發者社區tkm28資訊網——每日最新資訊28at.com

https://ost.51cto.comtkm28資訊網——每日最新資訊28at.com

介紹

本示例使用滑動手勢監聽,實時調整左右兩側內容顯示區域大小和效果。通過綁定gesture事件中的PanGesture平移手勢,實時獲取拖動距離。當拖動時,實時地調節左右兩個Image組件的寬度,從而成功實現左右拖動切換圖片效果的功能。tkm28資訊網——每日最新資訊28at.com

效果圖預覽

tkm28資訊網——每日最新資訊28at.com

使用說明

點擊中間按鈕進行左右拖動切換圖片。tkm28資訊網——每日最新資訊28at.com

實現思路

本例涉及的關鍵特性和實現方案如下:tkm28資訊網——每日最新資訊28at.com

創建三個Stack組件,用來展示裝修前后對比圖,第一個和第三個Stack分別存放裝修前的圖片和裝修后的圖片,zIndex設置為1。第二個Stack存放按鈕的圖片,zIndex設置為2,這樣按鈕的圖片就會覆蓋在兩張裝修圖片之上。
源碼參考DragToSwitchPicturesView.ets。tkm28資訊網——每日最新資訊28at.com

Row() {  Stack() {...}  .zIndex(CONFIGURATION.ZINDEX1)  .width(this.leftImageWidth) // z序設為1,為了使按鈕圖片浮在裝修圖片上。  Stack() {...}  .width($r('app.integer.drag_button_stack_width'))  .zIndex(CONFIGURATION.ZINDEX2) // z序設為2,為了使按鈕圖片浮在裝修圖片上。  Stack() {...}  .zIndex(CONFIGURATION.ZINDEX1) // z序設為1,為了使按鈕圖片浮在裝修圖片上。  .width(this.rightImageWidth)}.justifyContent(FlexAlign.Center).width($r('app.string.full_size'))

將Image組件放在Row容器里,將Row容器的寬度設置為狀態變量,再利用clip屬性對于Row容器進行裁剪。
源碼參考DragToSwitchPicturesView.ets。tkm28資訊網——每日最新資訊28at.com

Row() {  Image($r('app.media.before_decoration'))    .width($r('app.integer.decoration_width'))// Image的width固定,Row的寬度變化,通過裁剪實現布局效果。    .height($r('app.integer.decoration_height'))    .draggable(false) // 設置Image不能拖動,不然長按Image會被拖動。  }  .width(this.leftImageWidth) // 將左側Row的width設置為leftImageWidth,這樣左側Row的width隨leftImageWidth的變化而變化。  .clip(true) // clip屬性設置為true,裁剪超出Row寬度的圖片。  .zIndex(CONFIGURATION.ZINDEX1) // z序設為1,為了使水印浮在裝修圖片上。  .borderRadius({    topLeft: $r('app.integer.borderradius'),    bottomLeft: $r('app.integer.borderradius')  }) // 將Row的左上角和左下角弧度設為10實現效果。

右邊的Image組件與左邊同樣的操作,但是新增了一個direction屬性,使元素從右至左進行布局,為的是讓Row從左側開始裁剪。
源碼參考DragToSwitchPicturesView.ets。tkm28資訊網——每日最新資訊28at.com

Row() { Image($r('app.media.after_decoration'))   .width($r('app.integer.decoration_width'))   .height($r('app.integer.decoration_height'))   .draggable(false)}.width(this.rightImageWidth).clip(true).zIndex(CONFIGURATION.ZINDEX1) // z序設為1,為了使水印浮在裝修圖片上。// TODO: 知識點:左邊Row使用clip時從右邊開始裁剪,加了Direction.Rtl后,元素從右到左布局,右邊Row使用clip時從左邊開始裁剪,這是實現滑動改變視圖內容大小的關鍵。.direction(Direction.Rtl).borderRadius({ topRight: $r('app.integer.borderradius'), bottomRight: $r('app.integer.borderradius')}) // 將Row的右上角和右下角弧度設為10實現效果。

中間的Image組件通過手勢事件中的滑動手勢對Image組件滑動進行監聽,對左右Image組件的寬度進行計算從而重新布局渲染。
源碼參考DragToSwitchPicturesView.ets。tkm28資訊網——每日最新資訊28at.com

Image($r('app.media.drag_button'))  .width($r('app.integer.drag_button_image_width'))  .height($r('app.integer.decoration_height'))  .draggable(false)  .gesture( // TODO: 知識點:拖動手勢事件設置一個手指,滑動的最小距離設置為1vp,實現滑動時按鈕跟手動效。    PanGesture({ fingers: CONFIGURATION.PANGESTURE_FINGERS, distance: CONFIGURATION.PANGESTURE_DISTANCE })      .onActionStart(() => {        this.dragRefOffset = CONFIGURATION.INIT_VALUE; // 每次拖動開始時將圖標拖動的距離初始化。      })      // TODO: 性能知識點: 該函數是系統高頻回調函數,避免在函數中進行冗余或耗時操作,例如應該減少或避免在函數打印日志,會有較大的性能損耗。      .onActionUpdate((event: GestureEvent) => {        // 通過監聽GestureEvent事件,實時監聽圖標拖動距離        this.dragRefOffset = event.offsetX;        this.leftImageWidth = this.imageWidth + this.dragRefOffset;        this.rightImageWidth = CONFIGURATION.IMAGE_FULL_SIZE - this.leftImageWidth;        if (this.leftImageWidth >= CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE) { // 當leftImageWidth大于等于310vp時,設置左右Image為固定值,實現停止滑動效果。          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_RIGHT_LIMIT_SIZE;        } else if (this.leftImageWidth <= CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE) { // 當leftImageWidth小于等于30vp時,設置左右Image為固定值,實現停止滑動效果。          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_LEFT_LIMIT_SIZE;        }      })      .onActionEnd((event: GestureEvent) => {        if (this.leftImageWidth <= CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE) {          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_LEFT_LIMIT_SIZE;          this.imageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;        } else if (this.leftImageWidth >= CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE) {          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_RIGHT_LIMIT_SIZE;          this.imageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;        } else {          this.leftImageWidth = this.imageWidth + this.dragRefOffset; // 滑動結束時leftImageWidth等于左邊原有Width+拖動距離。          this.rightImageWidth = CONFIGURATION.IMAGE_FULL_SIZE - this.leftImageWidth; // 滑動結束時rightImageWidth等于340-leftImageWidth。          this.imageWidth = this.leftImageWidth; // 滑動結束時ImageWidth等于leftImageWidth。        }      })  )

工程結構&模塊類型

dragtoswitchpictures                             // har包   |---common   |   |---Constants.ets                            // 常量類   |---data   |   |---DragToSwitchPicturesData.ets             // 生成模擬數據   |---datasource   |   |---BasicDataSource.ets                      // Basic數據控制器   |   |---DragToSwitchPicturesDataSource.ets       // 左右拖動切換圖片數據控制器   |---mainpage   |   |---DragToSwitchPictures.ets                 // 主頁面   |---model   |   |---DragToSwitchPicturesModule.ets           // 左右拖動切換圖片數據模型   |---view   |   |---DragToSwitchPicturesView.ets             // 左右拖動切換圖片視圖   |   |---DesignCattleView.ets                     // AI設計視圖   |   |---TabsWaterFlowView.ets                    // 瀑布流嵌套Tabs視圖

模塊依賴

routermoduletkm28資訊網——每日最新資訊28at.com

高性能知識點

本例使用了onActionUpdate函數。該函數是系統高頻回調函數,避免在函數中進行冗余或耗時操作,例如應該減少或避免在函數打印日志,會有較大的性能損耗。tkm28資訊網——每日最新資訊28at.com

本示例使用了LazyForEach進行數據懶加載,WaterFlow布局時會根據可視區域按需創建FlowItem組件,并在FlowItem滑出可視區域外時銷毀以降低內存占用。tkm28資訊網——每日最新資訊28at.com

本示例使用了cachedCount設置預加載的FlowItem的數量,只在LazyForEach中生效,設置該屬性后會緩存cachedCount個FlowItem,LazyForEach超出顯示和緩存范圍的FlowItem會被釋放。tkm28資訊網——每日最新資訊28at.com

想了解更多關于開源的內容,請訪問:tkm28資訊網——每日最新資訊28at.com

51CTO 鴻蒙開發者社區tkm28資訊網——每日最新資訊28at.com

https://ost.51cto.comtkm28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-76513-0.html左右拖動切換圖片效果案例

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 實戰 | 生產環境中如何動態調整線程池大???

下一篇: 2024 年這五個 Node.js 后端框架最受歡迎!

標簽:
  • 熱門焦點
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度?! RM軟件市場規模如今超過580
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • OPPO、vivo、小米等國內廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據外媒報道,研究機構的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top 主站蜘蛛池模板: 阳泉市| 苏尼特右旗| 龙里县| 竹北市| 香港| 进贤县| 平湖市| 灌云县| 宿迁市| 凤台县| 天祝| 修武县| 修文县| 玛纳斯县| 新巴尔虎右旗| 比如县| 威远县| 长白| 宽甸| 米脂县| 甘肃省| 易门县| 西藏| 嵩明县| 绥芬河市| 琼中| 景德镇市| 陇川县| 琼结县| 施秉县| 自贡市| 平谷区| 牙克石市| 金寨县| 赤峰市| 彰武县| 吉林市| 年辖:市辖区| 秦皇岛市| 屏东市| 岳池县|