更多信息请访问:Harmonyos技术社区https://harmonyos.51cto.com与华为官方共同建立。获取手指按下时的位置(坐标)3.实现案例:在文本框中分别设置按下、移动、松开的位置4.根据手指的位置判断是上、下、左、右滑动五、滑动事件bug处理六、onTouchEvent方法的返回值七、验证onTouchEvent方法的返回值对滑动事件三个动作的影响1、滑动事件的三个??动作获取手指位置滑动事件的获取:获取手指位置涉及到坐标的概念,通过获取x,y,z,可以缺少手机任意一点的坐标:除了x,y轴,还有z轴。在鸿蒙手机中,完整的坐标如下,是一个三维的A三维坐标系,但通常很少用到z轴。一般来说,只需要考虑x和y轴。结合滑动事件的三个??动作和坐标来分析滑动2.获取手指按下时的位置(坐标)。获取到的数据实际上被鸿蒙OS封装到了TouchEvent动作对象中。要通过动作调用getPointerPosition方法,您需要传递一个值。鸿蒙OS支持多指操作。例如,可以用两根手指来放大或缩小图片,那么getPointerPosition中需要传入一个索引,其中一根手指操作传入的值为0,表示要获取第一根手指的位置,它的位置也被封装成一个对象,然后通过坐标对象分别获取x和y坐标。//获取手指按下时的位置(坐标)MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示手指按下时的位置floatx=point.getX();floaty=point.getY();text1.setText(x+"---"+y);3、实现案例:在文本框中分别设置按下、移动、松开的位置。新建工程:ListenerApplication4ability_main使用默认生成的文本内容。在DirectionalLayout布局和Text组件中分别添加idMainAbilitySlice使用当前类被编写为实现类接口的一种方式.Component;importohos.agp.components.DirectionalLayout;importohos.agp.components.Text;importohos.multimodalinput.event.TouchEvent;publicclassMainAbilitySliceextendsAbilitySliceimplementsComponent.TouchEventListener{Texttext1=null;@OverridepublicvoidonStart(Intentintent){setintentintent(Resource.Consuent)Layout_ability_main);//1。首先找到整个布局对象DirectionalLayoutdl=(DirectionalLayout)findComponentById(ResourceTable.Id_dl);text1=(Text)findComponentById(ResourceTable.Id_text1);//2。为整个布局添加滑动事件//当我们整个布局滑动时,会调用该类中的onTouchEvent方法//在按下、移动、释放的过程中,代码会不断调用中的onTouchEvent方法此类dl.setTouchEventListener(this);}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}@OverridepublicbooleanonTouchEvent(Componentcomponent,TouchEventtouchEvent){//参数1:component表示滑动的组件(layout也是一个组件,所以component也可以用来表示布局对象)//其实此时代表的是DirectionalLayout布局对象,这个布局是铺全屏//参数2:touchEvent代表动作对象(按下,滑动,抬起)//获取当前手指操作屏幕(按下,滑动,抬起)intaction=touchEvent.getAction();//1:表示按下操作//2:表示释放操作//3.表示滑动/移动操作if(action==TouchEvent.PRIMARY_POINT_DOWN){//只需编写按下时需要运行的代码//获取按下按下时手指的位置(坐标)MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示按下时手指的位置floatx=point.getX();floaty=point.getY();text1.setText(x+"---"+y);}elseif(action==TouchEvent.POINT_MOVE){//移动或滑动//获取手指按下时的位置(坐标)MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示手指按下时的位置floatx=point.getX();floaty=point.getY();text1.setText(x+"---"+y);}elseif(action==TouchEvent.PRIMARY_POINT_UP){//释放或抬起//获取的位置thefingerwhenpressed(coordinates)MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示手指按下时的位置floatx=point.getX();floaty=point.getY();text1.setText(x+"---"+y);}returntrue;}}操作:按下并移动时ng鼠标,坐标值会随着鼠标的移动而变化4.根据手指的位置判断滑动是上、下、左、右,首先将按下时的x、y移到onTouchEvent方法的外面,因为如果不移到外面,按下时会调用onTouchEvent方法firsttime,then按下时会调用position,获取x和y坐标并设置在文本框中。设置完成后,整个方法就会在那里。拿到之后,就会从记忆中消失。按下时x和y的值也消失了所以在方法外定义x和y,因为得到的是小数,要定义为float类型的位置不需要得到。只要比较按下和松开的位置,就可以判断是向上,向下,向左,向右滑动哪一个向下滑动,修改上面代码如下定义x和y的位置在外面onTouchEvent方法//记录手指按下的位置floatstartX=0;floatstartY=0;onTouchEvent方法中的if判断做如下修改if(action==TouchEvent.PRIMARY_POINT_DOWN){MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示手指按下时的位置startX=point.getX();startY=point.getY();}elseif(action==TouchEvent.POINT_MOVE){//移动的位置不需要获取,只要比较按下和松开的位置判断哪一个向上滑动即可,down,leftandright}elseif(action==TouchEvent.PRIMARY_POINT_UP){//松开或抬起MmiPointpoint=touchEvent.getPointerPosition(0);//x,y表示手指按下时的位置floatendX=point.getX();floatendY=point.getY();//比较手指按下时的位置和手指松开时的位置if(endX>startX){text1.setText("向右滑动");}elseif(endXstartY){text1.setText("向下滑动");}elseif(endYstartX&&Math.abs(endY-startY)<100){text1.setText("Slideright");}elseif(endXstartY&&Math.abs(endX-startX)<100){text1.setText("向左滑动");}elseif(endY移动->释放,为true时,这三个action会执行onTouchEvent方法,执行下面对应的代码当为false时,只有按下这个动作才会触发onTouchEvent方法,执行下面相应的代码。7.验证onTouchEvent方法的返回值是否影响滑动事件的三个??动作。上面代码不变,onTouchEvent方法改成如下:){count++;intaction=touchEvent.getAction();if(action==TouchEvent.PRIMARY_POINT_DOWN){text1.setText("Press");}elseif(action==TouchEvent.POINT_MOVE){text1.setText("Move");}elseif(action==TouchEvent.PRIMARY_POINT_UP){text1.setText("Release");}//如果为true,表示所有动作都会triggerthecurrentmethodandexecutethecorrespondingcode//如果为false,表示只有一个动作会触发当前方法并执行相应代码,后续动作不会触发当前方法returnfalse;}运行后,按然后移动并释放。显示的文本依赖相同,说明返回值为false。只有按下这个动作才会触发onTouchEvent方法,执行下面相应的代码。onTouchEvent方法不会在移动或释放时执行。将上面的返回值改为true,运行后。发现文字显示的值会随着按下、移动、松开的动作而变化。所以滑动事件一般写true。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区