首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Fabric.js折线自定义控件怎么实现?

Fabric.js折线自定义控件怎么实现?

提问于 2022-09-23 02:42:25
回答 0关注 0查看 200

Fabric.js 官方demo有个多边形自定义的控件 http://fabricjs.com/custom-controls-polygon

但是将其中的多边形替换成折线会出现问题线不跟着控制点 或者控制点不在线上 哪位大神帮忙实现下

代码语言:javascript
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .controls {
            display: inline-block;
        }
    </style>
</head>
<body>
<div class="controls">
    <p>
        <button id="edit" onclick="Edit()">Toggle editing polygon</button>
    </p>
</div>
<canvas id="c" width="500" height="400" style="border:1px solid #ccc"></canvas>
<script src="./fabric.js"></script>
<script>
    var canvas = this.__canvas = new fabric.Canvas('c');
    // create a polygon object
    var points = [{
        x: 30, y: 30
    }, {
        x: 150, y: 140
    }, {
        x: 240, y: 150
    }, {
        x: 100, y: 30
    } ]
    // 将官方多边形替换成折线
    const polygon = new fabric.Polyline([
        {x: 30, y: 30},
        {x: 150, y: 140},
        {x: 240, y: 150},
        {x: 100, y: 30}
    ], {
        fill: 'transparent', // 如果画折线,需要填充透明
        stroke: '#6639a6', // 线段颜色:紫色
        strokeWidth: 5 // 线段粗细 5
    })
    canvas.viewportTransform = [1, 0, 0, 0.7, -50, 50];
    canvas.add(polygon);

    // define a function that can locate the controls.
    // this function will be used both for drawing and for interaction.
    function polygonPositionHandler(dim, finalMatrix, fabricObject) {
        var x = (fabricObject.points[this.pointIndex].x - fabricObject.pathOffset.x),
            y = (fabricObject.points[this.pointIndex].y - fabricObject.pathOffset.y);

        console.log('x',x);
        console.log('y',y);
        return fabric.util.transformPoint(
            { x: x, y: y },
            fabric.util.multiplyTransformMatrices(
                fabricObject.canvas.viewportTransform,
                fabricObject.calcTransformMatrix()
            )
        );
    }

    function getObjectSizeWithStroke(object) {
        var stroke = new fabric.Point(
            object.strokeUniform ? 1 / object.scaleX : 1,
            object.strokeUniform ? 1 / object.scaleY : 1
        ).multiply(object.strokeWidth);
        return new fabric.Point(object.width + stroke.x, object.height + stroke.y);
    }

    // define a function that will define what the control does
    // this function will be called on every mouse move after a control has been
    // clicked and is being dragged.
    // The function receive as argument the mouse event, the current trasnform object
    // and the current position in canvas coordinate
    // transform.target is a reference to the current object being transformed,
    function actionHandler(eventData, transform, x, y) {
        var polygon = transform.target;
        var    currentControl = polygon.controls[polygon.__corner];
        var   mouseLocalPosition = polygon.toLocalPoint(new fabric.Point(x, y), 'center', 'center');
        var   polygonBaseSize = getObjectSizeWithStroke(polygon);
        var   size = polygon._getTransformedDimensions(0, 0);
        var   finalPointPosition = {
                x: mouseLocalPosition.x * polygonBaseSize.x / size.x + polygon.pathOffset.x,
                y: mouseLocalPosition.y * polygonBaseSize.y / size.y + polygon.pathOffset.y
            };
        polygon.points[currentControl.pointIndex] = finalPointPosition;
        return true;
    }

    // define a function that can keep the polygon in the same position when we change its
    // width/height/top/left.
    function anchorWrapper(anchorIndex, fn) {
        return function(eventData, transform, x, y) {
            var fabricObject = transform.target,
                absolutePoint = fabric.util.transformPoint({
                    x: (fabricObject.points[anchorIndex].x - fabricObject.pathOffset.x),
                    y: (fabricObject.points[anchorIndex].y - fabricObject.pathOffset.y),
                }, fabricObject.calcTransformMatrix()),
                actionPerformed = fn(eventData, transform, x, y),
                newDim = fabricObject._setPositionDimensions({}),
                polygonBaseSize = getObjectSizeWithStroke(fabricObject),
                newX = (fabricObject.points[anchorIndex].x - fabricObject.pathOffset.x) / polygonBaseSize.x,
                newY = (fabricObject.points[anchorIndex].y - fabricObject.pathOffset.y) / polygonBaseSize.y;
            fabricObject.setPositionByOrigin(absolutePoint, newX + 0.5, newY + 0.5);
            return actionPerformed;
        }
    }

    function Edit() {
        // clone what are you copying since you
        // may want copy and paste on different moment.
        // and you do not want the changes happened
        // later to reflect on the copy.
        var poly = canvas.getObjects()[0];
        canvas.setActiveObject(poly);
        poly.edit = !poly.edit;
        if (poly.edit) {
            var lastControl = poly.points.length - 1;
            poly.cornerStyle = 'circle';
            poly.cornerColor = 'rgba(0,0,255,0.5)';
            /* 编辑状态重新画点 */
            poly.controls = poly.points.reduce(function(acc, point, index) {
                console.log('index',index);
                acc['p' + index] = new fabric.Control({
                    positionHandler: polygonPositionHandler,
                    actionHandler: anchorWrapper(index > 0 ? index - 1 : lastControl, actionHandler),
                    actionName: 'modifyPolygon',
                    pointIndex: index
                });
                return acc;
            }, { });
        } else {
            poly.cornerColor = 'blue';
            poly.cornerStyle = 'rect';
            poly.controls = fabric.Object.prototype.controls;
        }
        poly.hasBorders = !poly.edit;
        canvas.requestRenderAll();
    }

</script>


</body>
</html>

回答 1

正道知行

修改于 2022-08-25 13:57:52

代码语言:java
AI代码解释
复制
import org.json4s.DefaultFormats
import org.json4s.native.Serialization.{read, write}

implicit lazy val formats: DefaultFormats.type = DefaultFormats

    val source = env.addSource(new SourceFunc_UserInfo())
    val dataStream = source
      // map
      .map(data => write(data)) // 转 json
      .map(json => read[UserInfo](json)) // 转 case class
和开发者交流更多问题细节吧,去 写回答
相关文章
map怎么转json对象_json怎么获取map
JSON 对象保存在大括号内。就像在JavaScript中, 对象可以保存多个 键/值 对。Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值) 都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。
全栈程序员站长
2022/09/23
3.6K0
map怎么转json对象_object转jsonobject
业务背景:因为要嵌套一些数据报表,页面点击菜单直接进行url访问,因访问受限要修改url权限,返回数据是JSONObject,防止出现异常,后台进行了一些Map于JSONObject的转换,记录下来
全栈程序员站长
2022/09/23
2.8K0
ES6 json转map map转json
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147698.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/02
3.5K0
ES6 json转map map转json
json转map
java中map和json互转工具类,注意方法示例的格式(这里是最简单的无嵌套的格式),不满足此格式的不合适: package com.yscredit.sz.util; import com.alibaba.fastjson.JSON; import org.apache.commons.collections.map.LinkedMap; import org.codehaus.jackson.map.ObjectMapper; import java.util.ArrayList; impo
IT云清
2019/01/22
3K0
json对象转map对象_json map
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172454.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2.6K0
Java map转实体类_java实体类转json
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.5K0
java map转json字符_Map转JSON字符串
[java]代码库package com.smartAnji.control.utils;
全栈程序员站长
2022/08/31
2.3K0
golang json 转map
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149025.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/04
9890
objectmapper json转对象_json数组转map
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
5.4K0
golang map转json
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151299.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.6K0
jquery Map转JSON
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151322.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
1.1K0
alibaba String转json转map
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145506.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/27
5K0
go 对象json转map
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145734.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/29
1.6K0
复杂json转MAP对象
普通json对象或者字符串转换map或者实体就不说了,这里主要提供复杂json 转map的方法
全栈程序员站长
2022/07/04
1.8K0
java中map转json[通俗易懂]
在日常的使用中,我们一般会遇到map转json,如果遍历的话会浪费大量的时间,其实我们拥有这样的jar包
全栈程序员站长
2022/08/31
1.5K0
java解析json转Map
前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:
全栈程序员站长
2022/07/02
3.2K0
java map转object_json对象转map集合
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125104.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/03
2.3K0
class、case class、object、case object的区别
case class的成员默认都是常量,所以case class适用于数据成员不改变的场景,而且case class之间可以进行比较
opencode
2022/12/26
8900
string转jsonstring_java json转map
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/04
3.3K0
Scala Json对象转Map对象[通俗易懂]
文章来源:https://blog.csdn.net/qq_37267676/article/details/116668384
全栈程序员站长
2022/09/23
2.1K0

相似问题

怎么转ajax?

0142

swift data怎么转json,oc能转,swift 转出来是空的?

0310

转团关系怎么做?

0358

负数int转byte[]怎么搞?

0293

微信认证怎么转QQ认证?

1180
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
到家集团 | 技术VP擅长5个领域
web前端擅长4个领域
擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文