搜狐新聞直播間適配HarmonyOs實現點贊動畫

01

背景介紹

隨著新聞客戶端鴻蒙單框架系統適配工作的推進,從原來的基礎功能到現在已經適配全功能的85%以上。與此同時,我們也在持續深入挖掘鴻蒙系統的特性,以提升整體應用的質量與用戶體驗。在這一過程中,動畫作為增強交互與視覺體驗的重要手段,成為不可或缺的一環。本文將通過一個實際案例,詳細介紹鴻蒙 ArkUI 動畫的用法,如何利用ArkUI提供的API及其特性實現相對復雜的動畫,并對比 Android 平臺的實現方式。首先,我們來看一下新聞客戶端在 Android 上直播間點贊動效的效果,見圖1。圖2為利用ArkUI動畫API在HarmonyOS系統上實現的效果:

圖1

圖2

動畫解析:當發生點擊事件時,點贊按鈕會有一個放大動畫,隨之點贊按鈕底部會出現一個飄動的愛心,向上按照一定的曲線進行位移,同時在位移的過程中伴隨有透明度,縮放的變化,同時點贊數加一,這一系列變化是一組動畫;當長按事件觸發時,以固定的頻率連續觸發這一組動畫的播放。

02

ArkUI動畫API簡介

ArkUI提供了全面的動畫實現方式,其中包括屬性動畫、轉場動畫、粒子動畫、組件動畫、幀動畫等。目前在整個適配過程中,我們用的比較多的就是屬性動畫和轉場動畫,而屬性動畫也是最適合為組件定制動效的API。ArkUI提供了三種屬性動畫接口:animateTo、animation和keyframeAniamteTo。

animateTo是一個通用函數,通過對比閉包內狀態變量和閉包前狀態變量的差異通過改變狀態變量實現動畫效果,支持嵌套、能多次調用。animation是組件的一個屬性,只能改變該屬性之前設置的組件屬性,keyframeAniamteTo是關鍵幀動畫,通過設置關鍵幀實現動畫效果。本次動畫使用animateTo實現動畫,該API介紹如下:

animateTo(value: AnimateParam, event:?()?=>?void):?void

AnimateParam可以指定本次動畫的時長、曲線效果(Curve)、重復次數、結束回調等參數,而event閉包則是本次動畫需要改變哪些狀態變量,更多參數可查閱鴻蒙的開發文檔。

03

Android實現

先介紹下Android上實現的方法,向上飄動的愛心所做出的透明度、縮放動畫相對容易實現,位移的曲線動畫是這個動畫比較難實現的點。如何讓飄動的愛心每一次路徑都不重復,并且能夠實現一個平滑的曲線效果呢?這里就要用到強大的貝塞爾曲線了,通過輸入不同的起點和終點以及控制點,就可以繪制不同效果的曲線,從而實現連續且弧度優美的路徑曲線。當完成了路徑的動畫之后,加上透明度、縮放動畫就能實現上述效果了。下面結合代碼講解實現的核心思路:

首先自定義組合View,按照效果圖所示結構進行布局,布局底部放一個用于顯示點贊圖標的ImageView,在圖標頂部放置一個TextView用于顯示點贊數。然后監聽圖標的點擊事件,當點擊事件觸發時,我們利用Android 系統中View的public void addView(View child, int index, LayoutParams params)方法添加一個用于做動畫的ImageView,該ImageView就是接下來用于進行動畫的核心對象。添加完執行動畫的View就可以構造動畫集合執行動畫了。具體添加動畫ImageView的方法如下:

private?fun?addHeartImage()?{mVibrator.vibrate(10)val?moveImage = ImageView(context)if?(mFlyDrawable ==?null) {moveImage.setImageResource(R.drawable.ico_live_new_heart)}?else?{moveImage.setImageDrawable(mFlyDrawable)//服務器下發}addView(moveImage,?0, LayoutParams(mLikedImg.width, mLikedImg.height).apply {addRule(CENTER_HORIZONTAL, TRUE)addRule(ALIGN_PARENT_BOTTOM, TRUE)bottomMargin = DensityUtils.dip2px(context,?24f)})val?animatorSet = AnimatorSet()val?moveAnimator = getBezierAnimator(moveImage)val?scaleXAnimator = getScaleAnimator(moveImage,?"scaleX")val?scaleYAnimator = getScaleAnimator(moveImage,?"scaleY")animatorSet.playTogether(moveAnimator, scaleXAnimator, scaleYAnimator)animatorSet.duration = mAnimationDurationanimatorSet.start()
}

第二步是完善第一步中的getBezierAnimator()方法,該方法會返回一個ValueAnimator對象,這個動畫對象實現的就是開頭介紹的貝塞爾曲線。利用Android動畫框架的屬性動畫、以及自定義估值器,可以實現Android動畫系統規定以外的類型插值。這里自定義一個估值器,因為路徑動畫是通過控制ImageView的x和y屬性實現位移,因此估值器的泛型定義為PointF類型,三次貝塞爾曲線的公式如下:

根據上述公式,我們可以完成估值器的計算過程如下:

/*** 計算貝塞爾曲線路徑,實現自然平滑的動畫效果*/
class?BezierEvaluator(privateval?controlPoint1: PointF,?privateval?controlPoint2: PointF) : TypeEvaluator<PointF> {overridefun?evaluate(fraction:?Float, startValue:?PointF, endValue:?PointF): PointF {val?pathPoint = PointF()// 貝塞爾三次方公式pathPoint.x =startValue.x * (1?- fraction) * (1?- fraction) * (1?- fraction) +3?* controlPoint1.x * fraction * (1?- fraction) * (1?- fraction) +3?* controlPoint2.x * fraction * fraction * (1?- fraction) +endValue.x * fraction * fraction * fractionpathPoint.y =startValue.y * (1?- fraction) * (1?- fraction) * (1?- fraction) +3?* controlPoint1.y * fraction * (1?- fraction) * (1?- fraction) +3?* controlPoint2.y * fraction * fraction * (1?- fraction) +endValue.y * fraction * fraction * fractionreturn?pathPoint}
}

三次貝塞爾曲線一共有四個點,起始點、終點以及兩個控制點,發生位移的ImageView在向上移動的過程中,起始點是固定的,終點是隨機的,要實現下圖擺動曲線的效果,兩個控制點必須控制在圖中黃色區域內,當控制點也隨機產生之后,動畫的曲線就不再重合,從而實現向上移動并隨機擺動的效果。

根據上述思路以及三次貝塞爾曲線計算View的x、y屬性的插值器,完善獲取貝塞爾曲線位移效果的動畫代碼如下:

/*** 注:* DensityUtils.dip2px(context, 35f):點贊按鈕圖片的大小* DensityUtils.dip2px(context, 24f):點贊按鈕距父控件底部的 Margin*/
privatefun?getBezierAnimator(targetView:?View): ValueAnimator {//計算隨機控制點val?pointF1 = PointF(Random.nextInt(width - DensityUtils.dip2px(context,?35f)).toFloat(),Random.nextInt(height /?2) + height /?2f?- DensityUtils.dip2px(context,?35f?+?24f).toFloat())val?pointF2 = PointF(width /?2?+ Random.nextInt(width).toFloat() /?2?- DensityUtils.dip2px(context,?35f),Random.nextInt(height /?2).toFloat())Log.d(TAG,?"pointF1 = (${pointF1.x},${pointF1.y})")Log.d(TAG,?"pointF2 = (${pointF2.x},${pointF2.y})")//計算起始點和終點val?startPoint = PointF((width /?2?- DensityUtils.dip2px(context,?35f) /?2).toFloat(),height - DensityUtils.dip2px(context,?35f?+?24f).toFloat())val?endPoint = PointF(Random.nextInt(width - DensityUtils.dip2px(context,?35f)).toFloat(),?0f)Log.d(TAG,?"startPoint = (${startPoint.x},${startPoint.y})")Log.d(TAG,?"endPoint = (${endPoint.x},${endPoint.y})")val?bezierEvaluator = BezierEvaluator(pointF1, pointF2)val?valueAnimator = ObjectAnimator.ofObject(bezierEvaluator, startPoint, endPoint)valueAnimator.duration = mAnimationDurationvalueAnimator.interpolator = DecelerateInterpolator()valueAnimator.addListener(object?: AnimatorListenerAdapter() {overridefun?onAnimationStart(animation:?Animator)?{addLikedNum()}overridefun?onAnimationEnd(animation:?Animator)?{removeView(targetView)}})valueAnimator.addUpdateListener { animator: ValueAnimator ->// 自定義估值器BezierEvaluator的貝塞爾公式算出的 pointval?bezierPoint = animator.animatedValue?as?PointFtargetView.x = bezierPoint.xtargetView.y = bezierPoint.ytargetView.alpha = (1?- animator.animatedFraction +?0.1).toFloat()}return?valueAnimator
}

04

HarmonyOS實現

HarmonyOS系統上,ArkUI動畫框架提供的API與Android系統的動畫框架差別比較大,在HarmonyOS系統中,動畫的實現方式有屬性動畫、幀動畫、粒子動畫等,從Android上實現的經驗來看使用屬性動畫實現該案例比較合適。ArkUI是聲明式UI,并沒有類似Android中可以在運行時直接添加組件的方法,所以需要找到代替方案替代Android上的addView() 和 removeView()方法。

在ArkUI中,控制渲染流程可以用到if/else、ForEach 以及LazyForEach,該動畫需要考慮到用戶連續點擊,多個向上位移動畫的組件同時渲染,因此if/else并不合適,ForEach需要搭配List容器組件使用,因此只剩下LazyForEach。Ark UI中,UI的變化是通過狀態變量控制的,由此需要設計一個數組,初始化為空數組,當觸發一次動畫操作時,向數組中添加一個數據,此時系統會根據數組的數量自動渲染對應的組件,當組件準備完成時執行屬性動畫,控制動畫的狀態變量放在數組里的對象中,當動畫執行結束時,從數組中移除該數據,相應的組件也隨之移除。

首先還是構建組件的布局,按照效果圖依然封裝自定義組件,采用Image組件進行點贊按鈕的渲染,同時使用Text組件進行點贊數的展示,通過DevcoStudio中的ArkUI Inspector可以得到布局效果如下圖所示:

組件布局結構代碼實現如下,同時利用LazyForEach的特性為后面動態添加組件做渲染流程控制,build函數內代碼如下:

build() {Stack({ alignContent: Alignment.Bottom }) {LazyForEach(this.animaList,?(item: AnimationState) =>?{//當animaList中添加數據時,可以在這里渲染對應的UI組件,即一個向上飄動的Image組件,//向上飄動的過程由動畫實現},?(item: AnimationState) =>JSON.stringify(item))Column({ space:?2?}) {Text(this.liveRoomViewModel.liveData.likeCount.toString()).fontSize(9).fontColor($r('app.color.text5')).fontWeight(FontWeight.Bold).width('100%').textAlign(TextAlign.Center)Image($r('app.media.ico_live_new_heart')).width(35).height(35).borderRadius(35).scale({ x:?this.likedButtonScale, y:?this.likedButtonScale }).backgroundColor('#40ffffff').draggable(false).onClick(()=>{//當點擊時間觸發時,向this.animaList中添加一個數據,對應會渲染一個動畫組件})}}.width(65).height(200)
}

上述代碼中,Image組件上設置點擊事件,當點擊事件觸發時,向數組中添加一條數據,而該數組所綁定的LazyForEach組件會執行對應的渲染邏輯,當一次點擊發生時,需要對應渲染一個Image組件,同時進行對應的動畫,動畫結束時將該數據從數組中移除,執行完動畫的組件隨即從組件樹中移除。多次點擊產生的多個動畫對象不能相互影響,因此將控制動畫的狀態變量保存在數組對應的對象中,因此設計如下類保存動畫所需數據:

@ObservedV2
exportclass?AnimationState {
@Trace?P0:?number[] = [0,?0];?// 起點(通常為 View 的初始位置)
// 控制點1
@Trace?P1:?number[] = [this.getRandomInt(0,?65),?this.getRandomInt(0,?-80)];
// 控制點2?
@Trace?P2:?number[] = [this.getRandomInt(0,?65),?this.getRandomInt(-80,?-165)];?
@Trace?P3:?number[] = [this.getRandomInt(-15,?15),?-140];?// 終點
@Trace?progress:?number?=?0;?// 動畫進度 0~1
@Trace?scale:?number?=?0.3;?//縮放動畫
@Trace?alpha:?number?=?0.8;?//透明度動畫id:?string?=?''//數據時間戳用于唯一標識constructor(id:?string) {this.id = id}getRandomInt(min:?number, max:?number):?number?{returnMath.floor(Math.random() * (max - min +?1)) + min;}
}

AnimationState 類中一些常數是組件的尺寸大小,通過計算起點、控制點、終點需要限制在一定的范圍內,類似于Android中實現的那樣。變量progress是動畫的一個核心變化因子,類似于Android估值器實現類evaluate方法中的fraction變量,progress隨著動畫的時間變化由0到1變化,變化的效果由動畫設置的曲線決定。scale、alpha分別控制動畫的縮放、透明度變化。

如何啟動動畫呢?首先在Image組件的點擊事件方法中向數組中添加一個對象,同時設置好動畫參數的初始值,代碼如下:

this.animaList.pushData(new?AnimationState(Date.now().toString()))

當this.animaList數組中有數據添加時,LazyForEach即開始渲染對應的組件,因此在對應處渲染一個Image組件,設置好業務需要的圖片,當組件準備完成即將送顯時,利用ArkUI提供的動畫API animateTo()方法開啟動畫,animateTo()方法可參考官方文檔鏈接(https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-explicit-animation),該方法主要設置動畫的時長、曲線、重復方式以及哪些屬性要做動畫,比如在該方法的閉包中將progress的值賦值為1,時長設置為1000毫秒,那么progress的值會在設置的時間內根據曲線的效果進行不斷的改變,時間結束時會變成賦值的1。具體代碼如下,在閉包中同時開啟了縮放動畫和透明度動畫,也就是progress的變化與縮放動畫、透明度變化同時開始,具體代碼如下:

LazyForEach(this.animaList,?(item: AnimationState) =>?{Image(this.flyImageLoadFailed ? $r('app.media.ico_zan_v6') :this.liveRoomViewModel.liveInfoModel.likeAnimation || $r('app.media.ico_zan_v6')).width(35).height(35).opacity(item.alpha).onError(()?=>?{this.flyImageLoadFailed =?true}).scale({x: item.scale,y: item.scale}).translate({x:?this.calculateCubicBezier(item.P0, item.P1, item.P2, item.P3, item.progress)[0],y:?this.calculateCubicBezier(item.P0, item.P1, item.P2, item.P3, item.progress)[1]}).onAppear(()?=>?{this.liveRoomViewModel.localCacheLikedNum ++animateTo({duration:?1000,?// 動畫時長curve: Curve.Ease,?//動畫以低速開始,然后加快,在結束前變慢iterations:?1,?// 播放次數(-1 表示無限循環)playMode: PlayMode.Normal,onFinish:?()?=>?{this.animaList.deleteData(this.animaList.findIndex((findItem) =>?findItem.id === item.id))}},?()?=>?{//縮放動畫animateTo({duration:?500,?// 動畫時長curve: Curve.EaseIn,?//動畫以低速開始iterations:?1,?// 播放次數(-1 表示無限循環)playMode: PlayMode.Normal,onFinish:?()?=>?{animateTo({duration:?500,?// 動畫時長curve: Curve.EaseOut,?//動畫以低速結束iterations:?1,?// 播放次數(-1 表示無限循環)playMode: PlayMode.Normal,},?()?=>?{item.scale =?0.3})}},?()?=>?{item.scale =?1.2})//透明度動畫animateTo({duration:?800,?// 動畫時長curve: Curve.EaseOut,?//動畫以低速結束iterations:?1,?// 播放次數(-1 表示無限循環)playMode: PlayMode.Normal,delay:?200,},?()?=>?{item.alpha =?0})vibrationV2(50,'alarm')item.progress =?1;?// 驅動 progress 從 0 到 1})})
},?(item: AnimationState) =>JSON.stringify(item))

隨著動畫的開始,組件還需要進行位移,設置的progress會從0變到1,那么就可以利用progress通過貝塞爾曲線計算動畫組件的路徑,通過公式可以得到如下方法:

// 三次貝塞爾計算公式,用于計算路徑
private?calculateCubicBezier(P0:?number[], P1:?number[], P2:?number[], P3:?number[], t:?number):?number[] {const?x = (1?- t)**3?* P0[0] +3?* t * (1?- t)**2?* P1[0] +3?* t**2?* (1?- t) * P2[0] +t**3?* P3[0];const?y = (1?- t)**3?* P0[1] +3?* t * (1?- t)**2?* P1[1] +3?* t**2?* (1?- t) * P2[1] +t**3?* P3[1];return?[x, y];
}

該方法返回一個數組,同時該方法計算過程利用到數組中對象的狀態變量,因此給組件設置translate時,利用該方法計算對應的x、y值,UI會隨著progress的變化從而引起位置變化,從而達到觸發位移動畫的目的。同時在animateTo()方法的onFinish回調中移除這條數據,動畫結束時組件自動從組件樹移除,實現效果如本篇開頭ArkUI實現效果所示,滿足動效設計要求。

05

總結

本文主要介紹實現復雜動畫的思路以及同樣的動畫HarmonyOS系統與Android系統的區別,其中一些業務代碼未給出,這里只給出核心代碼。ArkUI的動畫框架對比Android系統的動畫框架區別還是很大的,ArkUI是聲明式UI,動畫也是由狀態變量驅動的,并且ArkUI引擎對動畫渲染做了很多技術革新,掌握了ArkUI動畫也能在開發中利用動畫做出更好的過度效果,使應用更加流暢,自然。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93064.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

83、設置有人DTU設備USR-M100采集傳感器數據,然后上傳阿里云服務

基本思想:設置M100 采集傳感器數據 一、首先將DTU設備USR-M100連接路由器上,然后使用python代碼搜索同一局域網設備, import platform import sys import os import time import threadinglive_ip = 0def get_os():os = platform.system()if os == "Windows":re…

P1019 [NOIP 2000 提高組] 單詞接龍

題目描述單詞接龍是一個與我們經常玩的成語接龍相類似的游戲&#xff0c;現在我們已知一組單詞&#xff0c;且給定一個開頭的字母&#xff0c;要求出以這個字母開頭的最長的“龍”&#xff08;每個單詞都最多在“龍”中出現兩次&#xff09;&#xff0c;在兩個單詞相連時&#…

詳解力扣高頻SQL50題之1633. 各賽事的用戶注冊率【簡單】

傳送門&#xff1a;1633. 各賽事的用戶注冊率 題目 用戶表&#xff1a; Users -------------------- | Column Name | Type | -------------------- | user_id | int | | user_name | varchar | -------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表中的每行包…

FROM stakater/java8-alpine 構建cocker鏡像

在 Dockerfile 中&#xff0c;FROM stakater/java8-alpine 是第一條也是最核心的指令&#xff0c;它定義了構建新鏡像所基于的「基礎鏡像」。以下是逐層解析&#xff1a;&#x1f50d; 關鍵字拆解 1. FROM —— 起點指令 ? 作用&#xff1a;聲明當前鏡像的起點&#xff08;父鏡…

Word2Vec模型訓練全流程解析:從數據預處理到實體識別應用

請添加圖片描述 訓練Word2Vec模型 概述 問題 我們如何訓練Word2Vec模型&#xff1f;在特定數據集上訓練Word2Vec模型何時是有利的&#xff1f; 目標 理解在自有數據上訓練Word2Vec模型而非使用預訓練模型的優勢 Colab環境配置 運行以下代碼以啟用輔助函數并重新讀取數據…

在Ubuntu上使用QEMU學習RISC-V程序(2)gdb調試

文章目錄一、準備工作二、基本調試流程1. 設置斷點2. 執行程序3. 查看源代碼/匯編三、查看寄存器1. 查看通用寄存器2. 查看特殊寄存器四、查看內存1. 內存查看命令2. 內存修改命令五、調試實戰示例六、高級調試技巧1. 條件斷點2. 自動顯示3. 內存斷點&#xff08;觀察點&#x…

不止于“亮”:一盞智慧路燈的技術進化史——塔能科技用“落地性”定義行業標準

在凌晨3點的園區道路之上&#xff0c;路燈會隨著車輛的靠近而自動亮起&#xff0c;待車輛逐漸遠去之后&#xff0c;又會緩緩地調暗下來&#xff1b;當電纜意外被觸碰的時候&#xff0c;系統能夠在短短3秒之內自動發出報警信息&#xff0c;并且推送出維修工單&#xff1b;而當一…

Redis的String數據類型底層實現

redis就是用c語言寫&#xff0c;但redis的string并沒有直接用c語言的string&#xff0c;而是自己搞了一個 SDS 結構體來表示字符串。SDS 的全稱是 Simple Dynamic String&#xff0c;中文叫做“簡單動態字符串”。想知道為什么這么做&#xff0c;我們先看看c語言的string是什么…

【音視頻學習】四、深入解析視頻技術中的YUV數據存儲方式:從原理到實踐

文章目錄 引言 1. YUV 基礎:為什么它比 RGB 更適合視頻? 1.1 YUV 與 RGB 的核心區別 1.2 YUV色度下采樣簡介 2. YUV 的三大存儲方式 方式一:平面格式(Planar) 方式二:半平面格式(Semi-Planar ) 方式三:打包格式(Packed YUV) 三種存儲方式對比: 3. 如何選擇合適的 Y…

前端項目組成

一、前端項目常見模塊及功能&#xff08;以 Vue/React 通用結構為例&#xff09; 前端項目的模塊本質是「按功能拆分的代碼文件/文件夾」&#xff0c;就像蓋房子的「磚、梁、窗」各司其職&#xff1a;模塊類型功能說明&#xff08;大白話&#xff09;舉個例子pages&#xff08;…

聚觀早報 | 猿編程推動中美青少年AI實踐;華為Pura 80數字版售價公布;iPhone 17 Air電池曝光

聚觀早報每日整理最值得關注的行業重點事件&#xff0c;幫助大家及時了解最新行業動態&#xff0c;每日讀報&#xff0c;就讀聚觀365資訊簡報。整理丨肖羽7月24日消息猿編程推動中美青少年AI實踐華為Pura 80數字版售價公布iPhone 17 Air電池曝光亞馬遜收購AI初創公司Bee蜂巢半固…

unittest 案例執行順序詳解

unittest 案例執行順序詳解在 unittest 框架中&#xff0c;測試用例的執行順序有默認規則&#xff0c;也可通過自定義方式調整。以下是具體說明&#xff1a;一、默認執行順序規則unittest 對測試用例的執行順序遵循 “按測試方法名的 ASCII 碼排序” 原則&#xff0c;具體邏輯如…

【web大前端】001_前端開發入門:創建你的第一個網頁

前端開發入門&#xff1a;創建你的第一個網頁 在當今數字化時代&#xff0c;網頁已經成為人們獲取信息和交流的重要平臺。對于想要學習編程的人來說&#xff0c;前端開發往往是一個不錯的起點。本文將帶你通過簡單的兩步&#xff0c;創建屬于你的第一個網頁程序。 點擊這里去…

HTTP性能優化終極指南:從協議原理到企業級實踐

前言&#xff1a;為什么性能優化是Web開發的生命線&#xff1f;根據Google研究數據&#xff0c;當頁面加載時間從1秒增加到3秒時&#xff0c;跳出率提升32%&#xff1b;當達到5秒時&#xff0c;轉化率下降90%。本文將通過七層優化體系&#xff0c;帶您掌握HTTP性能優化的核心技…

Python 數據分析(二):Matplotlib 繪圖

目錄 1. 簡介2. 繪圖 2.1 折線圖 2.1.1 單線2.1.2 多線2.1.3 子圖 2.2 散點圖2.3 直方圖2.4 條形圖 2.4.1 縱置2.4.2 橫置2.4.3 多條 2.5 餅圖 1. 簡介 Matplotlib 是 Python 提供的一個繪圖庫&#xff0c;通過該庫我們可以很容易的繪制出折線圖、直方圖、散點圖、餅圖等豐…

Scrapy分布式爬蟲數據統計全棧方案:構建企業級監控分析系統

引言&#xff1a;數據統計在分布式爬蟲中的戰略價值在分布式爬蟲系統中&#xff0c;??數據統計與分析??是系統優化的核心驅動力。根據2023年爬蟲工程調查報告&#xff1a;實施專業統計方案的爬蟲系統性能提升??40%以上??數據驅動的優化策略可減少??70%??的資源浪費…

計劃任務(at和cron命令介紹及操作)

簡介計劃任務主要做一些周期性的任務&#xff0c;目前最主要的是定期備份數據分類at&#xff1a;一次性調度執行cron&#xff1a;循環調度執行at簡介at 是一個用于安排一次性任務的命令行工具&#xff0c;適合在指定時間點執行單次任務語法at 時間 選項若要提交&#xff0c;通過…

[2025CVPR:圖象合成、生成方向]WF-VAE:通過小波驅動的能量流增強視頻 VAE 的潛在視頻擴散模型

論文概述? 這篇論文提出了一種名為WF-VAE(Wavelet Flow VAE)?的新型視頻變分自編碼器(Video VAE),旨在解決潛在視頻擴散模型(LVDM)中的關鍵瓶頸問題,包括高計算成本和潛在空間不連續性。WF-VAE利用小波變換(Wavelet Transform)來分解視頻信號,并通過能量流路徑優…

Map接口-實現類HashMap

目錄 一、什么是Map&#xff1f; 二、實現類HashMap 1.關鍵特點 無序、key唯一、value允許重復、key和value允許為null。 2.數據結構 2.1 JDK 1.7 2.2 JDK 1.8 2.3 關鍵參數 2.4 關鍵計算 3.擴容方式 3.1 初始化 3.2 擴容 4.常見方法 4.1 根據key存入value 4.2 …

深入解析Hadoop如何實現數據可靠性:三副本策略、校驗和驗證與Pipeline復制

Hadoop數據可靠性的重要性在大數據時代&#xff0c;數據可靠性已成為企業數字化轉型的生命線。根據IDC預測&#xff0c;到2025年全球數據總量將增長至175ZB&#xff0c;其中企業數據占比超過60%。面對如此龐大的數據規模&#xff0c;任何數據丟失或損壞都可能造成數百萬美元的經…