成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[415874]]

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

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

https://harmonyos.51cto.com

Table of Contents

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

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

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

4. 根據(jù)手指的位置來確定是上、下、左、右哪個(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)的概念,通過獲取到 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)來分析滑動(dòng)

 

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

獲取的這些數(shù)據(jù)其實(shí)都被鴻蒙操作系統(tǒng)封裝到TouchEvent這個(gè)動(dòng)作對(duì)象當(dāng)中,通過動(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)、松開的位置分別設(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)類接口的方式編寫
  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)我們在整個(gè)布局滑動(dòng)的時(shí)候,就會(huì)調(diào)用本類中的onTouchEvent方法 
  26.         //在按下 移動(dòng)、松開的過程,代碼會(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:表示松開操作 
  50.         // 3. 表示滑動(dòng)/移動(dòng)操作 
  51.  
  52.         if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  53.             //只要寫按下時(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.             //松開或抬起 
  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ù)手指的位置來確定是上、下、左、右哪個(gè)滑動(dòng)

首先把按下時(shí)的 x、y 移動(dòng)onTouchEvent方法外面去,因?yàn)槿绻麤]有移動(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)的位置就不需要獲取了,只要按下和松開的位置進(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)的位置就不需要獲取了,只要按下和松開的位置進(jìn)行對(duì)比就可以判斷是上、下、左、右的哪個(gè)滑動(dòng)了 
  8. }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  9.     //松開或抬起 
  10.     MmiPoint point = touchEvent.getPointerPosition(0); 
  11.     //x、y表示按下時(shí)手指的位置 
  12.     float endX = point.getX(); 
  13.     float endY = point.getY(); 
  14.     //拿著按下時(shí)的位置跟松開時(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),然后松開

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

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

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

  • 此時(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í)候變化了超過了100,那就認(rèn)為這是一個(gè)無效的滑動(dòng),如果沒有超過,才認(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)斜的幅度超過100時(shí),就會(huì)認(rèn)為這是個(gè)無效的滑動(dòng),就不會(huì)顯示這個(gè)滑動(dòng)的動(dòng)作
  • 但運(yùn)行斜的幅度不超過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)——>松開,當(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("松開"); 
  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)、松開。顯示的文本依賴不變,說明返回值為false,只有按下這個(gè)動(dòng)作會(huì)觸發(fā) onTouchEvent方法并執(zhí)行下面對(duì)應(yīng)的代碼,移動(dòng)、松開都不會(huì)執(zhí)行onTouchEvent方法。

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

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

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

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

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(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-25 17:21:13

ADO返回值

2010-07-09 13:20:37

HART協(xié)議

2010-07-21 10:32:05

Perl函數(shù)返回值

2009-12-07 11:11:41

WCF返回值

2009-11-17 16:16:59

PHP遞歸函數(shù)

2009-09-07 03:07:11

C# Main方法

2010-03-02 16:50:34

WCF返回值

2022-02-23 13:31:26

RVO編譯器優(yōu)化

2011-07-19 17:33:53

存儲(chǔ)過程javaibatis

2022-01-17 06:58:35

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

2022-07-06 07:08:58

CPythonPython返回值

2021-12-19 23:58:51

Golang語言返回值

2010-03-17 17:37:17

Java線程返回值

2009-12-08 15:52:10

WCF回調(diào)

2009-12-23 10:34:15

ADO.NET 批處理

2017-04-27 21:00:33

Android滑動(dòng)分析

2016-11-04 08:53:05

androidjava單元測試
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 能看的av | 91久久 | 羞羞视频免费在线观看 | 国产一区二区 | 国产一级片91| 亚洲午夜精品在线观看 | 涩涩视频网 | 国产欧美一区二区三区日本久久久 | 精品成人免费一区二区在线播放 | 久久99精品久久久久久噜噜 | 国产精品123区 | 热99在线| 97超级碰碰| 日操操 | 欧日韩在线观看 | 69堂永久69tangcom | 91精品久久久久久久久久入口 | 日日操视频 | 久久国产精品亚洲 | 日日躁狠狠躁aaaaxxxx | 中文字幕国产精品 | 亚洲国产一区二区视频 | 一级大黄 | 成人av电影网 | 亚洲一区二区三区免费视频 | 日韩亚洲视频在线 | 国产欧美日韩久久久 | 国产成人精品av | 精品一区久久 | 亚洲香蕉 | 国产在线视频一区 | 天天操综合网 | 欧美精品一区三区 | 日韩精品视频在线免费观看 | 国产精品欧美一区二区三区不卡 | 成人午夜精品 | 精区3d动漫一品二品精区 | 国产精品久久久久久久久久免费看 | 日韩小视频 | 亚洲精品久久久一区二区三区 | 日韩 国产 在线 |