ohos扩展包——ComponentPositionHelper、TouchEventCompact
控件整体上下或左右平移帮助类 ComponentPositionHelper
替换安卓中View.offsetLeftAndRight(int)与View.offsetTopAndBottom(int)
使用
ComponentPositionHelper.offsetTopAndBottom(view, offsetTop);
ComponentPositionHelper.offsetLeftAndRight(view, offsetLeft);
ComponentPositionHelper.getCurrentOffsetTop(view, offsetTop);
ComponentPositionHelper.getCurrentOffsetLeft(view, offsetLeft);
原理
由于鸿蒙在滚动过程中为单个控件setPosition、setTop或者setComponentPosition等能改变位置的api,会出现多个控件飞离的问题,因此需要为每个需要做位移的控件都设置精确的位置,才不会出现问题。
这里通过获取要位移控件的父控件的所有子控件中,top位于该控件之下的所有控件,为他们setComponentPosition来改变位置,达到整体平移的效果。同时,由于a控件的位移导致b控件跟着位移,那么再次以b控件为准的位移需要算上a控件而导致的位移。
触摸事件纠正类 TouchEventCompact
由于在旧版SDK中,通过TouchEvent.getPointerPosition获取的坐标,在MOVE事件中会偏移,造成计算偏差(API5已修复)。并且VelocityDetector计算速度是基于TouchEvent.getPointerPosition函数的,偏移会造成速度计算错误,比如速度过快、过慢、速度正负值错误等。因此需要使用此类纠正MOVE事件中的偏移。
并且TouchEvent.getPointerPosition函数获取的坐标是相对于偏移位置的:
Obtains the x and y coordinates of a pointer index relative to the offset position during touch control or trajectory tracking in an event.
也就是说,如果该控件通过getPointerPosition获取的坐标在做位移,那么下一次获取的坐标会是加上手指的位移与控件的位移,导致异常。并且VelocityDetector计算速度也会异常。
因此,不建议通过getPointerPosition获取坐标,而使用getPointerScreenPosition来获取。但是如果需要通过VelocityDetector来计算速度,就需要通过TouchEventCompact来纠正getPointerPosition的坐标并与getPointerScreenPosition的坐标同步。
注意:事件分发中的DispatchHelper类中默认使用了TouchEventCompact,并同步了getPointerPosition的坐标与getPointerScreenPosition的坐标。
使用
- 创建实例,注意不要重复调用构造函数:
/** * 不要反复构造对象 */ public TouchEventCompact()
- 如果需要使用VelocityDetector来计算速度,需要将getPointerPosition与getPointerScreenPosition同步
touchEventCompact.setAlignToScreenPosition(true);
// 或者使用下面的构造函数:
public TouchEventCompact(boolean alignToScreenPosition)
3、调用correct函数:
public void correct(TouchEvent ev)
4、如果需要获取getPointerPosition的坐标,在调用correct函数后,并且下一次correct之前,调用:
public float[] getOrigin()