偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

鴻蒙開源第三方組件—粒子破碎效果組件Azexplosion_ohos

開源
Azexplosion_ohos是一個實現(xiàn)粒子破碎動畫效果的組件,用戶可以通過點擊手機屏幕上的破碎對象(一般是指手機屏幕上顯示的圖片或文字),來達到將該對象破碎的效果。

[[412239]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

基于安卓平臺的粒子破碎效果組件Azexplosion(https://github.com/Xieyupeng520/AZExplosion), 實現(xiàn)了鴻蒙的功能化遷移和重構(gòu)。代碼已經(jīng)開源到(https://gitee.com/isrc_ohos/azexplosion_ohos),歡迎各位開發(fā)者下載使用并提出寶貴意見!

背景

Azexplosion_ohos是一個實現(xiàn)粒子破碎動畫效果的組件,用戶可以通過點擊手機屏幕上的破碎對象(一般是指手機屏幕上顯示的圖片或文字),來達到將該對象破碎的效果。該組件可以設(shè)置手機屏幕上的對象是否具有破碎效果,同時也可以更換破碎對象和破碎對象的背景。Azexplosion_ohos組件視覺效果突出、使用方便、可擴展性強,與小米手機刪除APP時的動態(tài)效果類似。

組件效果展示

組件應(yīng)用僅包含一個主界面,在界面中存在圖片和文字兩種破碎對象。當手指觸碰圖片(或文字)時,該圖片(或文字)在視覺上呈現(xiàn)破碎效果,且破碎粒子的顏色與原圖片(或文字)的顏色相對應(yīng),如圖1所示,效果看起來很解壓,非常好用~

鴻蒙開源第三方組件——粒子破碎效果組件Azexplosion_ohos-鴻蒙HarmonyOS技術(shù)社區(qū)

圖1 破碎效果展示

Sample解析

Azexplosion_ohos組件的核心功能主要被封裝在Library中,Sample的功能實現(xiàn)很簡潔,只需要構(gòu)建整體的布局,并調(diào)用Library提供的監(jiān)聽接口為整體顯示布局設(shè)置監(jiān)聽,即可實現(xiàn)效果執(zhí)行的對象的破碎效果,具體的實現(xiàn)步驟如下:

步驟1. 創(chuàng)建布局。

步驟2. 設(shè)置整體顯示布局。

步驟3. 導入相關(guān)類并實例化對象。

步驟4. 為整體顯示布局設(shè)置監(jiān)聽。

接下來我們來看一下每一個步驟涉及的詳細操作。

(1)創(chuàng)建布局

首先在XML文件中創(chuàng)建一個DirectionalLayout的布局,寬度和高度都跟隨父控件變化而調(diào)整。后在DirectionalLayout加入需要的破碎對象,可以是圖片或文字,如圖1所示,代碼如下所示。

  1. <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  2.               ohos:id="$+id:root" 
  3.               ohos:width="match_parent" 
  4.               ohos:height="match_parent" 
  5.               ohos:orientation="vertical"
  6.     <Text 
  7.             ohos:width="match_content"     //文字破碎對象 
  8.             ohos:text="破碎效果"                 
  9.             ohos:text_size="60vp" 
  10.             ohos:top_margin="10vp" 
  11.             ohos:left_margin="20vp" 
  12.             ohos:bottom_margin="15vp" 
  13.             ohos:right_padding="10vp" 
  14.             ohos:left_padding="40vp" 
  15.             ohos:height="match_content"/> 
  16.  
  17.     <DirectionalLayout ohos:id="$+id:group1" 
  18.             ohos:width="match_parent" 
  19.             ohos:height="100vp" 
  20.             ohos:top_margin="10vp" 
  21.             ohos:orientation="horizontal"
  22.  
  23.         <Image                           //圖片破碎對象 
  24.             ohos:id="$+id:qq" 
  25.             ohos:width="match_content" 
  26.             ohos:height="match_content" 
  27.             ohos:image_src="$media:qq" 
  28.             ohos:left_margin="25vp" 
  29.             ohos:right_margin="25vp" 
  30.             ohos:top_margin="15vp"/> 
  31.         ...... 

(2)設(shè)置整體顯示布局

在MainAbility文件的onStart()方法中,通過setUIContent為應(yīng)用設(shè)置整體顯示布局,將步驟(1)中的布局設(shè)置為應(yīng)用的主界面布局。為了顯示的美觀性,可以通過setBackground設(shè)置主界面的背景顏色。

  1. //directionalLayout 指向步驟(1)中的布局 
  2. DirectionalLayout directionalLayout = (DirectionalLayout) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_mian_activity, nullfalse); 
  3. ShapeElement element = new ShapeElement();    
  4. element.setRgbColor(new RgbColor(255,239,213));  
  5. directionalLayout.setBackground(element);      //背景顏色設(shè)置 
  6. super.setUIContent(directionalLayout);      //設(shè)置顯示布局 

(3) 導入相關(guān)類并實例化對象

在MainAbility中,通過import關(guān)鍵字導入Library中的ExplosionField 類,并在onStart()方法中實例化ExplosionField類對象。

  1. ExplosionField explosionField = new ExplosionField(this); 

(4)為整體顯示布局設(shè)置監(jiān)聽

調(diào)用ExplosionField類對象的內(nèi)部方法addListener,用于為整體顯示布局設(shè)置監(jiān)聽。整體顯示布局設(shè)置監(jiān)聽后,用戶點擊布局內(nèi)某個組件,組件就會出現(xiàn)破碎現(xiàn)象。

  1. explosionField.addListener((ComponentContainer)findComponentById(ResourceTable.Id_root)); 

 Library解析

在Sample中介紹了為整體顯示布局設(shè)置監(jiān)聽后,點擊布局內(nèi)的組件就會出現(xiàn)破碎現(xiàn)象。本節(jié),我們來講組件破碎現(xiàn)象形成的詳細原理。

先來看看Azexplosion_ohos組件的Library組成結(jié)構(gòu),如圖2所示,該部分主要由三個類組成,分別是ExplosionAnimator、ExplosionField、Particle。ExplosionAnimator主要用于生成粒子并執(zhí)行粒子破碎動畫,改變不同時刻的粒子狀態(tài);ExplosionField主要功能負責粒子集的畫布顯示;Particle類主要用于描述粒子的顏色、透明度等屬性。

鴻蒙開源第三方組件——粒子破碎效果組件Azexplosion_ohos-鴻蒙HarmonyOS技術(shù)社區(qū)

圖2 Library項目結(jié)構(gòu)

下面我們介紹Library內(nèi)部邏輯的執(zhí)行步驟。當用戶點擊破碎對象后,Library負責生成破碎對象對應(yīng)的矩陣圖像(PixelMap),然后把矩陣圖像分解成若干個粒子,最后再讓粒子動起來形成破碎的動畫,具體流程如圖3所示 。

鴻蒙開源第三方組件——粒子破碎效果組件Azexplosion_ohos-鴻蒙HarmonyOS技術(shù)社區(qū)

圖3 Library內(nèi)部邏輯的執(zhí)行步驟

1、圖像或文字轉(zhuǎn)換成PixelMap

為整體顯示布局添加listener后,會通過for循環(huán)的方式,為每一個布局內(nèi)的組件添加點擊監(jiān)聽。在getOnClickListener()方法中,會繼續(xù)調(diào)用ExplosionField類createBitmapFromView()方法,而createBitmapFromView()方法就是完成圖像或文字轉(zhuǎn)換成PixelMap(位圖)的關(guān)鍵方法。

在createBitmapFromView()方法中首先會創(chuàng)建一個100*100的空的PixelMap,若破碎對象為圖片,則通過調(diào)用ExplosionField類的getPixelMap()方法獲取Image的PixelMap;若破碎對象為文字,則直接返回空的PixelMap。此時,圖片的PixelMap自帶圖片原本的像素信息,而由于文字得到的PixelMap是空的,所以默認顯示黑色的破碎效果。

  1. //為每一個布局內(nèi)的組件添加點擊監(jiān)聽 
  2. public void addListener(Component view) { 
  3.     if (view instanceof ComponentContainer) { 
  4.         ComponentContainer viewGroup = (ComponentContainer) view
  5.         int count = viewGroup.getChildCount(); 
  6.         // 逐個取出布局內(nèi)的破碎對象 
  7.         for (int i = 0 ; i < count; i++) { 
  8.             addListener(viewGroup.getComponentAt(i)); 
  9.         } 
  10.     } else { 
  11.         //為每一個破碎對象設(shè)置點擊監(jiān)聽 
  12.         view.setClickable(true); 
  13.         view.setClickedListener(getOnClickListener()); 
  14.     } 
  15.  
  16. //將每一個破碎對象轉(zhuǎn)換為PixelMap 
  17.  private PixelMap createBitmapFromView(Component view) { 
  18.     //PixelMap參數(shù)初始化操作 
  19.     PixelMap.InitializationOptions options = new PixelMap.InitializationOptions(); 
  20.     options.size = new Size(100,100); 
  21.     //創(chuàng)建位圖對象 
  22.     PixelMap   = PixelMap.create(options); 
  23.     if(view.getName().equals("Id_qq")){ 
  24.         bitmap =getPixelMap(ResourceTable.Media_qq);   //qq的PixelMap 
  25.     } 
  26.     if(view.getName().equals("Id_qzone")) 
  27.         bitmap =getPixelMap(ResourceTable.Media_qzone);  //qzone的PixelMap 
  28.     if(view.getName().equals("Id_vx")) 
  29.         bitmap =getPixelMap(ResourceTable.Media_vx);    //微信的PixelMap 
  30.         ......     
  31.     return bitmap;  //將獲取的PixelMap返回 

2、生成破碎粒子

生成破碎粒子是ExplosionAnimator的功能之一,主要是對來自ExplosionField類的PixelMap進行處理。首先根據(jù)PixelMap的寬高,算出橫豎粒子的個數(shù)。然后計算出粒子所在位置的顏色。接著調(diào)用Particle類的generateParticle()方法生成粒子,生成的破碎粒子如圖4所示。

  1. //生成粒子 
  2.    private Particle[][] generateParticles(PixelMap bitmap, Rect bound) { 
  3.        int w = bound.getWidth();  //PixelMap的寬 
  4.        int h = bound.getHeight(); // PixelMap的高 
  5.        int partW_Count = w / Particle.PART_WH; //橫向粒子個數(shù) 
  6.        int partH_Count = h / Particle.PART_WH; //豎向粒子個數(shù) 
  7.        //粒子的寬 
  8.        int bitmap_part_w = bitmap.getImageInfo().size.width / partW_Count; 
  9.        //粒子的高 
  10.        int bitmap_part_h = bitmap.getImageInfo().size.height / partH_Count; 
  11.        //粒子矩陣 
  12.        Particle[][] particles = new Particle[partH_Count][partW_Count]; 
  13.        Point point = null
  14.        for (int row = 0; row < partH_Count; row ++) { //行 
  15.            for (int column = 0; column < partW_Count; column ++) { //列 
  16.                //取得當前粒子所在位置的顏色 
  17.                int color = bitmap.readPixel(new Position(column* bitmap_part_w, row * bitmap_part_h)); 
  18.                point = new Point(column, row); //x是列,y是行 
  19.                particles[row][column] = Particle.generateParticle(color, bound, point); 
  20.            } 
  21.        } 
  22.        return particles;   //返回粒子矩陣 
  23.    } 
鴻蒙開源第三方組件——粒子破碎效果組件Azexplosion_ohos-鴻蒙HarmonyOS技術(shù)社區(qū)

圖4 破碎粒子效果圖

3、執(zhí)行破碎動畫

接下來我們需要為粒子加上動畫,讓它們動起來,實現(xiàn)一個完整的動態(tài)效果。動畫效果的實現(xiàn)需要依賴ExplosionAnimator 類,ExplosionAnimator 類繼承自AnimatorValue類,可用于繪制動畫。下面我們具體分析動畫效果是如何實現(xiàn)的。

(1)創(chuàng)建ExplosionAnimator 類對象

在創(chuàng)建ExplosionAnimator 類對象的過程中,將被點擊的破碎對象的PixelMap作為參數(shù)傳入,得到ExplosionAnimator 類對象的成員變量包含上述PixelMap生成的粒子集。

  1. //創(chuàng)建元素為列表ExplosionAnimator類對象的數(shù)組列表 
  2. private ArrayList<ExplosionAnimator> explosionAnimators; 
  3. explosionAnimators = new ArrayList<ExplosionAnimator>();   
  4. //創(chuàng)建ExplosionAnimator 類對象  
  5. final ExplosionAnimator animator = new ExplosionAnimator(this, createBitmapFromView(view), rect);    
  6. //ExplosionAnimator 類對象添加到列表中 
  7. explosionAnimators.add(animator);  

(2)start()

當監(jiān)聽器監(jiān)聽到屏幕被觸碰時,通過(1)中創(chuàng)建的ExplosionAnimator 類對象調(diào)用start() 方法,通過invalidate()來刷新將要破碎的圖片所對應(yīng)的區(qū)塊,invalidate()方法會調(diào)用onDraw()方法進行動畫繪制。

  1. public void start() { 
  2.         super.start(); 
  3.         mContainer.invalidate(); 

(3)onDraw()

在onDraw()方法里,首先保存畫布的繪制狀態(tài)并修正因為狀態(tài)欄導致的錯位,然后循環(huán)調(diào)用ExplosionAnimator 的draw()方法。

  1. public void onDraw(Component component, Canvas canvas) { 
  2.     canvas.save(); // 保存畫布的繪制狀態(tài) 
  3.     canvas.translate(0,positions[1]); //修正因為狀態(tài)欄導致的錯位 
  4.     for (ExplosionAnimator animator : explosionAnimators) { 
  5.         animator.draw(canvas); 
  6.     } 
  7.     canvas.restore(); 

(4)draw()

在draw方法中,每次繪制都調(diào)用一次advance()方法讓粒子“前進一步”(逐漸向下擴散),然后設(shè)置畫筆的新屬性并重新繪制。

  1. public void draw(Canvas canvas) { 
  2.         //動畫結(jié)束時停止 
  3.         if(!isRunning()) { 
  4.             return
  5.         } 
  6.         for (Particle[] particle : mParticles) { 
  7.             for (Particle p : particle) { 
  8.                 p.advance(myvalue); 
  9.                 mPaint.setColor(new Color(p.color)); 
  10.                 //只是這樣設(shè)置,透明色會顯示為黑色 
  11.                 mPaint.setAlpha((int) (p.alpha)); 
  12.                 canvas.drawCircle(p.cx, p.cy, p.radius, mPaint); 
  13.             } 
  14.         } 
  15.         mContainer.invalidate(); 
  16.     } 

 最后,我們總結(jié)一下整體的動畫繪制的過程是如何實現(xiàn)的。首先在ExplosionField中調(diào)用ExplosionAnimator的start()方法開啟動畫,start()方法中會調(diào)用invalidate()方法來使ExplosionField重繪(調(diào)用onDraw方法)。

onDraw方法調(diào)用draw方法,draw方法中也使用invalidate強制ExplosionField重繪(調(diào)用onDraw方法),每一次循環(huán)完成一次重繪。 這樣兩者相互調(diào)用,不停地刷新,直到所有粒子都繪制完成,刷新停止,動畫繪制流程如圖5所示。

鴻蒙開源第三方組件——粒子破碎效果組件Azexplosion_ohos-鴻蒙HarmonyOS技術(shù)社區(qū)

圖5 動畫繪制流程

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-11-17 15:37:43

鴻蒙HarmonyOS應(yīng)用

2021-08-10 15:23:08

鴻蒙HarmonyOS應(yīng)用

2021-10-19 10:04:51

鴻蒙HarmonyOS應(yīng)用

2021-07-06 18:21:31

鴻蒙HarmonyOS應(yīng)用

2021-04-08 14:57:52

鴻蒙HarmonyOS應(yīng)用

2021-08-30 17:55:58

鴻蒙HarmonyOS應(yīng)用

2021-04-20 15:06:42

鴻蒙HarmonyOS應(yīng)用

2021-04-29 14:32:24

鴻蒙HarmonyOS應(yīng)用

2021-03-10 15:03:40

鴻蒙HarmonyOS應(yīng)用

2021-06-17 14:56:00

鴻蒙HarmonyOS應(yīng)用

2021-04-15 17:47:38

鴻蒙HarmonyOS應(yīng)用

2021-11-02 14:54:21

鴻蒙HarmonyOS應(yīng)用

2021-08-03 10:07:41

鴻蒙HarmonyOS應(yīng)用

2021-06-29 09:28:16

鴻蒙HarmonyOS應(yīng)用

2021-03-24 09:30:49

鴻蒙HarmonyOS應(yīng)用

2021-07-28 09:40:04

鴻蒙HarmonyOS應(yīng)用

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2021-03-01 14:00:11

鴻蒙HarmonyOS應(yīng)用

2021-08-26 16:07:46

鴻蒙HarmonyOS應(yīng)用

2021-01-27 10:04:46

鴻蒙HarmonyOS動畫
點贊
收藏

51CTO技術(shù)棧公眾號