自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS實(shí)戰(zhàn)—滑動(dòng)事件的坐標(biāo)和返回值

系統(tǒng) OpenHarmony
獲取的這些數(shù)據(jù)其實(shí)都被鴻蒙操作系統(tǒng)封裝到TouchEvent這個(gè)動(dòng)作對(duì)象當(dāng)中,通過(guò)動(dòng)作去調(diào)用getPointerPosition 方法,需要傳遞一個(gè)值。

[[415874]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

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

https://harmonyos.51cto.com

Table of Contents

1. 滑動(dòng)事件獲取手指位置

2. 獲取按下時(shí)手指的位置(坐標(biāo))

3. 實(shí)現(xiàn)案例:把按下、移動(dòng)、松開(kāi)的位置分別設(shè)置到文本框當(dāng)中

4. 根據(jù)手指的位置來(lái)確定是上、下、左、右哪個(gè)滑動(dòng)

5. 滑動(dòng)事件bug處理

6. onTouchEvent方法的返回值

7. 驗(yàn)證onTouchEvent方法的返回值對(duì)滑動(dòng)事件三個(gè)動(dòng)作的影響

1. 滑動(dòng)事件獲取手指位置

  • 滑動(dòng)事件的三個(gè)動(dòng)作:

  • 獲取手指的位置就涉及到坐標(biāo)的概念,通過(guò)獲取到 x、y、z就可以缺任意一個(gè)點(diǎn)的位置

  • 手機(jī)中的坐標(biāo):

  • 除了 x、y軸,還有z軸,在鴻蒙手機(jī)當(dāng)中,完整的坐標(biāo)如下,是一個(gè)立體的三維體系,但平時(shí)z軸用的非常少,一般情況只需考慮x、y軸就行了。

  • 結(jié)合滑動(dòng)事件的三個(gè)動(dòng)作和坐標(biāo)來(lái)分析滑動(dòng)

 

2. 獲取按下時(shí)手指的位置(坐標(biāo))

獲取的這些數(shù)據(jù)其實(shí)都被鴻蒙操作系統(tǒng)封裝到TouchEvent這個(gè)動(dòng)作對(duì)象當(dāng)中,通過(guò)動(dòng)作去調(diào)用getPointerPosition 方法,需要傳遞一個(gè)值。鴻蒙系統(tǒng)支持多手指的操作,比如:可以用兩個(gè)手指對(duì)圖片進(jìn)行放大或縮小,所以在getPointerPosition需要傳遞一個(gè)索引,一個(gè)手指操作傳遞的值為0,表示要獲取的是第一個(gè)手指的位置,他的位置也是封裝成一個(gè)對(duì)象,再用坐標(biāo)對(duì)象分別獲取到x、y坐標(biāo)。

  1. //獲取按下時(shí)手指的位置(坐標(biāo)) 
  2. MmiPoint point = touchEvent.getPointerPosition(0); 
  3. //x、y表示按下時(shí)手指的位置 
  4. float x = point.getX(); 
  5. float y = point.getY(); 
  6. text1.setText(x + "---" + y); 

3. 實(shí)現(xiàn)案例:把按下、移動(dòng)、松開(kāi)的位置分別設(shè)置到文本框當(dāng)中

  • 新建項(xiàng)目:ListenerApplication4

ability_main

  • 采用默認(rèn)生成的Text文本內(nèi)容,在此基礎(chǔ)上給DirectionalLayout布局和Text組件分別加上id
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     ohos:id="$+id:dl" 
  4.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:alignment="center" 
  8.     ohos:orientation="vertical"
  9.  
  10.     <Text 
  11.         ohos:id="$+id:text1" 
  12.         ohos:height="match_content" 
  13.         ohos:width="match_content" 
  14.         ohos:background_element="$graphic:background_ability_main" 
  15.         ohos:layout_alignment="horizontal_center" 
  16.         ohos:text="$string:mainability_HelloWorld" 
  17.         ohos:text_size="40vp" 
  18.         /> 
  19.  
  20. </DirectionalLayout> 

MainAbilitySlice

  • 采用當(dāng)前類作為實(shí)現(xiàn)類接口的方式編寫(xiě)
  1. package com.xdr630.listenerapplication.slice; 
  2.  
  3. import com.xdr630.listenerapplication.ResourceTable; 
  4. import ohos.aafwk.ability.AbilitySlice; 
  5. import ohos.aafwk.content.Intent; 
  6. import ohos.agp.components.Component; 
  7. import ohos.agp.components.DirectionalLayout; 
  8. import ohos.agp.components.Text; 
  9. import ohos.multimodalinput.event.TouchEvent; 
  10.  
  11. public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener { 
  12.  
  13.     Text text1 = null
  14.  
  15.     @Override 
  16.     public void onStart(Intent intent) { 
  17.         super.onStart(intent); 
  18.         super.setUIContent(ResourceTable.Layout_ability_main); 
  19.  
  20.         //1.先找到整個(gè)布局對(duì)象 
  21.         DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl); 
  22.         text1 = (Text) findComponentById(ResourceTable.Id_text1); 
  23.  
  24.         //2.給整個(gè)布局添加滑動(dòng)事件 
  25.         //當(dāng)我們?cè)谡麄€(gè)布局滑動(dòng)的時(shí)候,就會(huì)調(diào)用本類中的onTouchEvent方法 
  26.         //在按下 移動(dòng)、松開(kāi)的過(guò)程,代碼會(huì)不斷去調(diào)用本類中的 onTouchEvent方法 
  27.         dl.setTouchEventListener(this); 
  28.     } 
  29.  
  30.     @Override 
  31.     public void onActive() { 
  32.         super.onActive(); 
  33.     } 
  34.  
  35.     @Override 
  36.     public void onForeground(Intent intent) { 
  37.         super.onForeground(intent); 
  38.     } 
  39.  
  40.     @Override 
  41.     public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  42.         //參數(shù)1:component表示滑動(dòng)的組件(布局也是一種組件,所以也可以用component表示布局對(duì)象) 
  43.         //實(shí)際上此時(shí)代表的就是DirectionalLayout布局對(duì)象,這個(gè)布局是鋪滿整個(gè)屏幕的 
  44.         //參數(shù)2:touchEvent表示動(dòng)作對(duì)象(按下、滑動(dòng)、抬起) 
  45.  
  46.         //獲取當(dāng)前手指對(duì)屏幕進(jìn)行操作(按下、滑動(dòng)、抬起) 
  47.         int action = touchEvent.getAction(); 
  48.         // 1:表示按下操作 
  49.         // 2:表示松開(kāi)操作 
  50.         // 3. 表示滑動(dòng)/移動(dòng)操作 
  51.  
  52.         if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  53.             //只要寫(xiě)按下時(shí)需要運(yùn)行的代碼即可 
  54.             //獲取按下時(shí)手指的位置(坐標(biāo)) 
  55.             MmiPoint point = touchEvent.getPointerPosition(0); 
  56.             //x、y表示按下時(shí)手指的位置 
  57.             float x = point.getX(); 
  58.             float y = point.getY(); 
  59.             text1.setText(x + "---" + y); 
  60.         }else if (action == TouchEvent.POINT_MOVE){ 
  61.             //移動(dòng)或滑動(dòng) 
  62.             //獲取按下時(shí)手指的位置(坐標(biāo)) 
  63.             MmiPoint point = touchEvent.getPointerPosition(0); 
  64.             //x、y表示按下時(shí)手指的位置 
  65.             float x = point.getX(); 
  66.             float y = point.getY(); 
  67.             text1.setText(x + "---" + y); 
  68.         }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  69.             //松開(kāi)或抬起 
  70.            //獲取按下時(shí)手指的位置(坐標(biāo)) 
  71.             MmiPoint point = touchEvent.getPointerPosition(0); 
  72.             //x、y表示按下時(shí)手指的位置 
  73.             float x = point.getX(); 
  74.             float y = point.getY(); 
  75.             text1.setText(x + "---" + y); 
  76.         } 
  77.         return true
  78.     } 
  • 運(yùn)行:

  • 按下并且移動(dòng)鼠標(biāo)時(shí),坐標(biāo)數(shù)值就會(huì)隨著鼠標(biāo)的移動(dòng)而變化

4. 根據(jù)手指的位置來(lái)確定是上、下、左、右哪個(gè)滑動(dòng)

首先把按下時(shí)的 x、y 移動(dòng)onTouchEvent方法外面去,因?yàn)槿绻麤](méi)有移動(dòng)外面去,當(dāng)?shù)谝淮伟聪碌臅r(shí)候就會(huì)調(diào)用onTouchEvent方法,接著就會(huì)調(diào)用按下時(shí)的位置,獲取到x、y坐標(biāo)并設(shè)置到文本框里,設(shè)置完以后整個(gè)方法就么有了,獲取完后就從內(nèi)存中消失了,按下時(shí)的x、y的值也就消失了。

所以在方法外定義x、y,因?yàn)楂@取到的是小數(shù),要定義為float類型

移動(dòng)的位置就不需要獲取了,只要按下和松開(kāi)的位置進(jìn)行對(duì)比就可以判斷是上、下、左、右的哪個(gè)滑動(dòng)了

  • 右滑

  • 下滑

  • 把上述代碼進(jìn)行如下修改
  • 在onTouchEvent方法外定義x、y的位置

  1. //記錄按下手指的位置 
  2.     float startX = 0; 
  3.     float startY = 0; 
  • 在onTouchEvent方法里的if判斷作出如下修改
  1. if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  2.     MmiPoint point = touchEvent.getPointerPosition(0); 
  3.     //x、y表示按下時(shí)手指的位置 
  4.     startX = point.getX(); 
  5.     startY = point.getY(); 
  6. }else if (action == TouchEvent.POINT_MOVE){ 
  7.     //移動(dòng)的位置就不需要獲取了,只要按下和松開(kāi)的位置進(jìn)行對(duì)比就可以判斷是上、下、左、右的哪個(gè)滑動(dòng)了 
  8. }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  9.     //松開(kāi)或抬起 
  10.     MmiPoint point = touchEvent.getPointerPosition(0); 
  11.     //x、y表示按下時(shí)手指的位置 
  12.     float endX = point.getX(); 
  13.     float endY = point.getY(); 
  14.     //拿著按下時(shí)的位置跟松開(kāi)時(shí)手指的位置進(jìn)行比對(duì) 
  15.     if (endX > startX){ 
  16.         text1.setText("右滑"); 
  17.     }else if (endX < startX){ 
  18.         text1.setText("左滑"); 
  19.     }else if (endY > startY){ 
  20.         text1.setText("下滑"); 
  21.     }else if (endY < startY) { 
  22.         text1.setText("上滑"); 
  23.     } 
  • 運(yùn)行:

  • 按下后鼠標(biāo)從左往右移動(dòng),然后松開(kāi)

  • 按下后鼠標(biāo)從右往左移動(dòng),然后松開(kāi)

  • 按下后鼠標(biāo)從上往下移動(dòng),然后松開(kāi)

  • 按下后鼠標(biāo)從下往上移動(dòng),然后松開(kāi)

  • 此時(shí)還有一個(gè)明顯的bug,那就是當(dāng)鼠標(biāo)從最最左邊上面的點(diǎn)到最右邊下面的點(diǎn),既有下滑也有右滑

5. 滑動(dòng)事件bug處理

  • 當(dāng)我們滑動(dòng)的時(shí)候,滑的不直,滑的有點(diǎn)斜
  • 斜著滑,可以對(duì)Y變化的范圍(斜的幅度)做一個(gè)規(guī)定,假設(shè)變化為100,如果你滑的時(shí)候變化了超過(guò)了100,那就認(rèn)為這是一個(gè)無(wú)效的滑動(dòng),如果沒(méi)有超過(guò),才認(rèn)為這是一個(gè)有效的滑動(dòng)

  • 解決bug:

添加個(gè)絕對(duì)值,防止兩者大小相減出現(xiàn)復(fù)數(shù)

  1. if (endX > startX && Math.abs(endY - startY) < 100){ 
  2.         text1.setText("右滑"); 
  3.     }else if (endX < startX && Math.abs(endY - startY) < 100){ 
  4.         text1.setText("左滑"); 
  5.     }else if (endY > startY && Math.abs(endX - startX) < 100){ 
  6.         text1.setText("下滑"); 
  7.     }else if (endY < startY && Math.abs(endX - startX) < 100) { 
  8.         text1.setText("上滑"); 
  9.     } 
  • 運(yùn)行,當(dāng)斜的幅度超過(guò)100時(shí),就會(huì)認(rèn)為這是個(gè)無(wú)效的滑動(dòng),就不會(huì)顯示這個(gè)滑動(dòng)的動(dòng)作
  • 但運(yùn)行斜的幅度不超過(guò)100,就會(huì)顯示正確的滑動(dòng)效果

6. onTouchEvent方法的返回值

  • 如果為true,表示所有的動(dòng)作都會(huì)觸發(fā)當(dāng)前方法并執(zhí)行對(duì)應(yīng)的代碼
  • 如果為false,表示只有一個(gè)動(dòng)作會(huì)觸發(fā)當(dāng)前方法并執(zhí)行對(duì)應(yīng)的代碼,后續(xù)的動(dòng)作就不會(huì)觸發(fā)當(dāng)前方法
  • 滑動(dòng)事件的三個(gè)動(dòng)作:按下——>移動(dòng)——>松開(kāi),當(dāng)為true時(shí),這三個(gè)動(dòng)作都會(huì)執(zhí)行onTouchEvent方法并執(zhí)行下面對(duì)應(yīng)的代碼。為false時(shí),只有按下這個(gè)動(dòng)作會(huì)觸發(fā) onTouchEvent方法并執(zhí)行下面對(duì)應(yīng)的代碼

7. 驗(yàn)證onTouchEvent方法的返回值對(duì)滑動(dòng)事件三個(gè)動(dòng)作的影響

上述代碼不變,onTouchEvent方法改動(dòng)如下:

  1. public boolean onTouchEvent(Component component, TouchEvent touchEvent) { 
  2.  
  3.         count++; 
  4.  
  5.         int action = touchEvent.getAction(); 
  6.          
  7.         if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  8.             text1.setText("按下"); 
  9.         }else if (action == TouchEvent.POINT_MOVE){ 
  10.             text1.setText("移動(dòng)"); 
  11.         }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  12.             text1.setText("松開(kāi)"); 
  13.         } 
  14.         //如果為true,表示所有的動(dòng)作都會(huì)觸發(fā)當(dāng)前方法并執(zhí)行對(duì)應(yīng)的代碼 
  15.         //如果為false,表示只有一個(gè)動(dòng)作會(huì)觸發(fā)當(dāng)前方法并執(zhí)行對(duì)應(yīng)的代碼,后續(xù)的動(dòng)作就不會(huì)觸發(fā)當(dāng)前方法了 
  16.         return false
  17.     } 

運(yùn)行后,當(dāng)按下后再移動(dòng)、松開(kāi)。顯示的文本依賴不變,說(shuō)明返回值為false,只有按下這個(gè)動(dòng)作會(huì)觸發(fā) onTouchEvent方法并執(zhí)行下面對(duì)應(yīng)的代碼,移動(dòng)、松開(kāi)都不會(huì)執(zhí)行onTouchEvent方法。

把上面的返回值改為true,運(yùn)行后。發(fā)現(xiàn)文本顯示的值都會(huì)隨著按下、移動(dòng)、松開(kāi)的動(dòng)作進(jìn)行變化。

所以滑動(dòng)事件一般都寫(xiě)true。

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

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

https://harmonyos.51cto.com

 

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

2021-08-06 09:47:01

鴻蒙HarmonyOS應(yīng)用

2023-08-07 14:52:33

WindowsExplorer進(jìn)程

2021-08-13 11:31:23

HTTP

2009-12-07 11:11:41

WCF返回值

2010-07-21 10:32:05

Perl函數(shù)返回值

2009-12-25 17:21:13

ADO返回值

2010-07-09 13:20:37

HART協(xié)議

2022-02-23 13:31:26

RVO編譯器優(yōu)化

2010-03-02 16:50:34

WCF返回值

2011-07-19 17:33:53

存儲(chǔ)過(guò)程javaibatis

2009-11-17 16:16:59

PHP遞歸函數(shù)

2009-09-07 03:07:11

C# Main方法

2009-12-08 15:52:10

WCF回調(diào)

2010-03-17 17:37:17

Java線程返回值

2021-12-19 23:58:51

Golang語(yǔ)言返回值

2022-01-17 06:58:35

C語(yǔ)言函數(shù)錯(cuò)誤碼

2022-07-06 07:08:58

CPythonPython返回值

2009-12-23 10:34:15

ADO.NET 批處理

2025-01-17 10:52:26

定義函數(shù)編程Python

2010-04-15 17:20:54

Oracle存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

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