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

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

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

[[415874]]

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

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

https://harmonyos.51cto.com

Table of Contents

1. 滑動事件獲取手指位置

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

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

4. 根據(jù)手指的位置來確定是上、下、左、右哪個滑動

5. 滑動事件bug處理

6. onTouchEvent方法的返回值

7. 驗證onTouchEvent方法的返回值對滑動事件三個動作的影響

1. 滑動事件獲取手指位置

  • 滑動事件的三個動作:

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

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

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

  • 結(jié)合滑動事件的三個動作和坐標(biāo)來分析滑動

 

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

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

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

3. 實現(xiàn)案例:把按下、移動、松開的位置分別設(shè)置到文本框當(dā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)前類作為實現(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.先找到整個布局對象 
  21.         DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl); 
  22.         text1 = (Text) findComponentById(ResourceTable.Id_text1); 
  23.  
  24.         //2.給整個布局添加滑動事件 
  25.         //當(dāng)我們在整個布局滑動的時候,就會調(diào)用本類中的onTouchEvent方法 
  26.         //在按下 移動、松開的過程,代碼會不斷去調(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表示滑動的組件(布局也是一種組件,所以也可以用component表示布局對象) 
  43.         //實際上此時代表的就是DirectionalLayout布局對象,這個布局是鋪滿整個屏幕的 
  44.         //參數(shù)2:touchEvent表示動作對象(按下、滑動、抬起) 
  45.  
  46.         //獲取當(dāng)前手指對屏幕進(jìn)行操作(按下、滑動、抬起) 
  47.         int action = touchEvent.getAction(); 
  48.         // 1:表示按下操作 
  49.         // 2:表示松開操作 
  50.         // 3. 表示滑動/移動操作 
  51.  
  52.         if (action == TouchEvent.PRIMARY_POINT_DOWN){ 
  53.             //只要寫按下時需要運(yùn)行的代碼即可 
  54.             //獲取按下時手指的位置(坐標(biāo)) 
  55.             MmiPoint point = touchEvent.getPointerPosition(0); 
  56.             //x、y表示按下時手指的位置 
  57.             float x = point.getX(); 
  58.             float y = point.getY(); 
  59.             text1.setText(x + "---" + y); 
  60.         }else if (action == TouchEvent.POINT_MOVE){ 
  61.             //移動或滑動 
  62.             //獲取按下時手指的位置(坐標(biāo)) 
  63.             MmiPoint point = touchEvent.getPointerPosition(0); 
  64.             //x、y表示按下時手指的位置 
  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.            //獲取按下時手指的位置(坐標(biāo)) 
  71.             MmiPoint point = touchEvent.getPointerPosition(0); 
  72.             //x、y表示按下時手指的位置 
  73.             float x = point.getX(); 
  74.             float y = point.getY(); 
  75.             text1.setText(x + "---" + y); 
  76.         } 
  77.         return true
  78.     } 
  • 運(yùn)行:

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

4. 根據(jù)手指的位置來確定是上、下、左、右哪個滑動

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

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

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

  • 右滑

  • 下滑

  • 把上述代碼進(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表示按下時手指的位置 
  4.     startX = point.getX(); 
  5.     startY = point.getY(); 
  6. }else if (action == TouchEvent.POINT_MOVE){ 
  7.     //移動的位置就不需要獲取了,只要按下和松開的位置進(jìn)行對比就可以判斷是上、下、左、右的哪個滑動了 
  8. }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  9.     //松開或抬起 
  10.     MmiPoint point = touchEvent.getPointerPosition(0); 
  11.     //x、y表示按下時手指的位置 
  12.     float endX = point.getX(); 
  13.     float endY = point.getY(); 
  14.     //拿著按下時的位置跟松開時手指的位置進(jìn)行比對 
  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)從左往右移動,然后松開

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

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

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

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

5. 滑動事件bug處理

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

  • 解決bug:

添加個絕對值,防止兩者大小相減出現(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時,就會認(rèn)為這是個無效的滑動,就不會顯示這個滑動的動作
  • 但運(yùn)行斜的幅度不超過100,就會顯示正確的滑動效果

6. onTouchEvent方法的返回值

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

7. 驗證onTouchEvent方法的返回值對滑動事件三個動作的影響

上述代碼不變,onTouchEvent方法改動如下:

  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("移動"); 
  11.         }else if (action == TouchEvent.PRIMARY_POINT_UP){ 
  12.             text1.setText("松開"); 
  13.         } 
  14.         //如果為true,表示所有的動作都會觸發(fā)當(dāng)前方法并執(zhí)行對應(yīng)的代碼 
  15.         //如果為false,表示只有一個動作會觸發(fā)當(dāng)前方法并執(zhí)行對應(yīng)的代碼,后續(xù)的動作就不會觸發(fā)當(dāng)前方法了 
  16.         return false
  17.     } 

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

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

所以滑動事件一般都寫true。

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

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é)議

2009-12-07 11:11:41

WCF返回值

2010-07-21 10:32:05

Perl函數(shù)返回值

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

存儲過程javaibatis

2022-01-17 06:58:35

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

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滑動分析

2016-11-04 08:53:05

androidjava單元測試
點贊
收藏

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

主站蜘蛛池模板: 亚洲视频在线免费观看 | 成人福利网 | 日韩综合一区 | 久久精品久久精品久久精品 | 成人国产精品入口免费视频 | 日韩国产精品一区二区三区 | 日韩精品一区在线观看 | 日韩欧美在线观看视频 | 成人免费视频观看视频 | av电影手机版 | 凹凸日日摸日日碰夜夜 | 国产视频精品在线 | 国产欧美一区二区三区在线看 | 丁香综合| 色综合激情 | 欧美亚洲日本 | 丁香五月缴情综合网 | 国产午夜精品一区二区三区四区 | 亚洲国产精品99久久久久久久久 | 国产欧美在线 | 亚洲一区欧美 | www.亚洲.com | 国产一区二区三区免费 | 亚洲日本欧美日韩高观看 | 成人免费看黄网站在线观看 | 国产精品久久久久久婷婷天堂 | 久久婷婷国产 | 成人福利在线观看 | 97精品国产97久久久久久免费 | 国产japanhdxxxx麻豆 | 伊人超碰 | 精品一区国产 | 黑人精品 | 仙人掌旅馆在线观看 | 国产欧美一区二区三区在线看 | 国产成人精品一区二区三区在线 | 成年免费大片黄在线观看一级 | 免费视频一区二区三区在线观看 | 国产成人一区二区三区久久久 | 一色一黄视频 | 一区二区日韩 |