当前位置: 首页 > 知识库问答 >
问题:

javascript - uniapp小程序 图片热区怎么写?

巩阳秋
2024-08-14

有坐标有图片但是图片缩放后就跑偏了

<template >
    <view >
        <view v-for="(item,index) in hot_list">
          <image :data-index="index" :src="item.img" @load="hotBindload"  @click="hotBindtap"></image>
        </view>
    </view>
</template>
 
<script>
    import {
        getHotArea
        } from "@/utils/requ.js"
export default {
    data() {
        return {
            
                hot_list: [{
                    id: 1,
                    img: "图片地址",
                    type: "usemap",
                    area: [{
                        shape: "rect",
                        coords: "100,85,220,190",
                        type: "path",
                        path: "/pages/xxxx"
                      },
                      {
                        shape: "rect",
                        coords: "470,95,645,220",
                        type: "path",
                        path: "/pages/xxxx"
                      },
                      {
                        shape: "rect",
                        coords: "58,380,240,510",
                        type: "path",
                        path: "/pages/xxxx"
                      },
                      {
                        shape: "rect",
                        coords: "485,396,645,515",
                        type: "path",
                        path: "/pages/xxxx"
                      },
                    ],
                    ratio: 0
                  },
                  {
                    id: 3,
                    img: "图片地址",
                    type: "path",
                    path: "/pages/xxxx",
                    ratio: 0
                  }
                ]

        };
    },
    onLoad(){},
    
    methods: {
          hotBindload(e) {
            var _this = this;
            console.log(e,"图片信息")
            let windowWidth = uni.getSystemInfoSync().windowWidth;
            let imgWidth = e.detail.width;
            let ratio = windowWidth / imgWidth;
            _this.hot_list[e.target.dataset.index].ratio = ratio
          },
          
          hotBindtap(e) {
            var _this = this;
            console.log(e,"点击后的数据")
            let hot_area = _this.hot_list[e.target.dataset.index]
            if (hot_area.type == "usemap") {
              let area = getHotArea(e.detail, hot_area.area, hot_area.ratio)
              if (area) {
            console.log(area.path,"跳转地址")
                uni.redirectTo({
                  url: area.path
                })
              }
            } else if (hot_area.type == "path") {
              console.log(hot_area)
              uni.redirectTo({
                url: hot_area.path
              })
            }
          }

        
    }
};
</script>
 
<style>
</style>

requ.js

function getHotArea(point, area, ratio){
    console.log(point,"坐标参数")
    console.log(area,"坐标数据")
    console.log(ratio,"缩放比")
  for (var i = 0; i < area.length; i++) {
    var coords = area[i].coords.split(",");
    var x1 = parseInt(coords[0] * ratio)
    var y1 = parseInt(coords[1] * ratio)
    var x2 = parseInt(coords[2] * ratio)
    var y2 = parseInt(coords[3] * ratio)

    if (point.x >= x1 && point.x <= x2 && point.y >= y1 && point.y <= y2) {
      return area[i]
    }
  }
}

module.exports = {
  getHotArea: getHotArea
}

共有2个答案

卫增
2024-08-14

应该是坐标转换问题

淳于博文
2024-08-14

要解决图片缩放后热区位置跑偏的问题,你需要在图片加载后根据图片的实际宽度和显示容器的宽度计算出缩放比例,并应用这个比例来调整热区的坐标。你的代码中已经包含了这一逻辑,但需要注意的是,这个逻辑需要在图片完全加载后才能正确执行。

在你的代码中,你已经通过监听图片的 @load 事件来获取图片的宽度,并计算了缩放比例 ratio。接下来,你需要确保在点击事件中使用这个 ratio 来调整热区的坐标。从你给出的 getHotArea 函数来看,这部分逻辑是正确的。

然而,这里还有一些潜在的改进点和需要注意的地方:

  1. 确保图片加载完成:你的代码已经处理了图片加载完成的情况,但请确保所有相关的逻辑(如设置热区坐标)都在图片加载完成后执行。
  2. 热区坐标的更新:在你的代码中,ratio 是直接存储在 hot_list 数组的每个元素中的。这是可行的,但请确保在图片尺寸变化(如设备旋转)时重新计算这些比例。
  3. 性能考虑:如果图片和热区很多,每次点击都重新计算热区可能会导致性能问题。你可以考虑在图片加载时就计算好所有热区的调整后的坐标,并存储在某个数据结构中,以便快速查找。
  4. 错误处理:在实际应用中,应该添加错误处理逻辑,以处理图片加载失败、缩放比例计算错误等情况。
  5. 样式和布局:确保图片的样式和布局(如宽度、高度、边距等)在图片加载后不会发生变化,这可能会影响到热区的位置。
  6. 代码优化:你的 getHotArea 函数中,coords 的解析和计算可以封装成更小的函数,以提高代码的可读性和可维护性。

综上所述,你的代码在逻辑上是正确的,但可能需要根据实际情况进行一些调整和优化。如果你发现热区仍然跑偏,请检查是否有其他因素(如样式、布局、设备尺寸等)影响了热区的位置。

 类似资料:
  • 项目是用uniapp做的,只做支付宝小程序,现在需要给用户推送消息,这个是消息推送是完成由前端实现的吗???有没有相关的技术文档?

  • 请问下uniapp打包成app怎么上传图片,可以用chooseImage上传图片吗,chooseImage是不是已经被淘汰了,新版的chooseMedia不支持

  • 在公众号后台配置了隐私政策剪贴板,但还是复制报错“setClipboardData:fail api scope is not declared in the privacy agreement”

  • 图中的头像部分是通过后端请求来的图片, 现在我需要将整个卡片生成canvas图片,但是生成之后,其中的图片头像部分图片丢失了。 网上搜了很多,说是要把网路路径的图片转换为本地路径 这个具体要怎么转换呢?有没大佬遇到过类似的问题,救救孩子吧 \~^~/

  • 小程序模板中怎么传递参数,在JS文件中因为有其他地方传递了type所以方法这边改不了,模板中不能直接传递参数吗?查了文档说可以用data-type,那方法那边接参应该怎么写呢?谢谢 小程序模板中怎么传递参数?

  • 请问 monaco-editor 怎么将图片等自定义元素插入到编辑器,让图片可以跟随文本流被编辑、删除, 我尝试过 Content Widget 但是不是我想要的效果,我想要的效果类似富文本编辑器那样的。 有实现过的小伙伴感谢分享一下方案,谢谢。

  • 轻推电脑端消息框可实现图片复制。 操作方法:右击消息框中的图片,选择复制。

  • 1.手机版 编辑方法:选择发送的图片-编辑   2.电脑版 编辑方法:选择要发送的图片-编辑