自制移动组件逻辑(求封装好的方法)?

对Image组件进行监听TouchEvent事件,监测触屏位置为point,再将组件位置设置为point

自制移动组件逻辑(求封装好的方法)?-鸿蒙开发者社区重写onTouchEvent接口方法

public class Forward implements Component.TouchEventListener {

    @Override
    public boolean onTouchEvent(Component component, TouchEvent touchEvent) {
        int action =  touchEvent.getAction();
        MmiPoint point = touchEvent.getPointerScreenPosition(0);
        int x,y;
        x = (int) point.getX();
        y = (int) point.getY();
        if (action == TouchEvent.POINT_MOVE){
            component.setPosition(x, y);
        }
        return true;
    }
}

此时存在问题 getPointerScreenPosition 得到的位置坐标point是相对于整个屏幕

但是此时DirectionalLayout布局上边还有一部分TItle块,而设置 component.setPosition(x, y) 是相对于父组件设置的组件位置

当鼠标点击到组件进行移动,组件会向下偏移一部分,此时的(x, y)没有改变,是相对整个屏幕获取触摸点Point,设置组件位置时相对白色背景布局设置。

自制移动组件逻辑(求封装好的方法)?-鸿蒙开发者社区

请问有拖拽组件的封装好的方法吗?

或者有什么去掉上边黑色块的方法么?

感谢

 

鸿蒙
移动组件
接口
2022-02-15 13:40:18
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Frederie
1

组件拖拽的代码可以参考如下:

public class FourAbilitySlice extends AbilitySlice {

    Image image;

    Point startDragPoint;

    Point componentStartPoint;

 

 

    @Override

    public void onStart(Intent intent) {

        super.onStart(intent);

        super.setUIContent(ResourceTable.Layout_ability_four);

        image=findComponentById(ResourceTable.Id_image);

        image.setDraggedListener(Component.DRAG_HORIZONTAL_VERTICAL, new Component.DraggedListener() {

            @Override

            public void onDragDown(Component component, DragInfo dragInfo) {

            }

 

 

            @Override

            public void onDragStart(Component component, DragInfo dragInfo) {

                //获取组件在父组件中的起始位置

                componentStartPoint = new Point(component.getContentPositionX(),component.getContentPositionY());

                //开始拖拽起始点

                startDragPoint = dragInfo.startPoint;

            }

 

 

            @Override

            public void onDragUpdate(Component component, DragInfo dragInfo) {

                float xOffset = dragInfo.updatePoint.getPointX() - startDragPoint.getPointX();

                float yOffset = dragInfo.updatePoint.getPointY() - startDragPoint.getPointY();

 

 

                component.setContentPosition(componentStartPoint.getPointX() + xOffset, componentStartPoint.getPointY() + yOffset);

                componentStartPoint = new Point(component.getContentPositionX(),component.getContentPositionY());

            }

 

 

            @Override

            public void onDragEnd(Component component, DragInfo dragInfo) {

                float xOffset = dragInfo.updatePoint.getPointX() - startDragPoint.getPointX();

                float yOffset = dragInfo.updatePoint.getPointY() - startDragPoint.getPointY();

                component.setContentPosition(componentStartPoint.getPointX() + xOffset, componentStartPoint.getPointY() + yOffset);

            }

 

 

            @Override

            public void onDragCancel(Component component, DragInfo dragInfo) {

            }

        });

    }

}

分享
微博
QQ
微信
回复
2022-02-15 15:02:03
相关问题
新人简单封装方法
2825浏览 • 1回复 待解决
获取状态栏高度等方法
6221浏览 • 1回复 待解决
大佬告知ArkUI有图表组件吗?
78浏览 • 1回复 待解决
关于逻辑删除问题有懂吗?
869浏览 • 1回复 待解决
移动边缘计算基本想法是怎样
2039浏览 • 1回复 待解决
弹窗组件无法进入onPageShow方法
52浏览 • 1回复 待解决
如何判断移动流量热点网络
57浏览 • 1回复 待解决
js 自定义组件如何传递方法
4181浏览 • 2回复 待解决
MySQL重复列逻辑处理?
729浏览 • 1回复 待解决
自定义组件如何增加自己对外方法
127浏览 • 1回复 待解决
如何在鸿蒙移动端引入坐标图?
388浏览 • 1回复 待解决
ArkTS写法是否可以按TS/JS逻辑理解
134浏览 • 1回复 待解决
封装HTTP请求在ArkTS中常见吗
1134浏览 • 1回复 已解决