开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1446|回复: 0
收起左侧

[技术分享] uniapp实现拖动的诀窍

[复制链接]
发表于 2021-10-28 17:02:42 | 显示全部楼层 |阅读模式   广东省揭阳市

还在为实现类似于QQ视频通话 那样的视频窗口随意拖动而苦恼吗?福音来了,今天就为大家解决这样的烦恼。
前提:
使用 anyrtc 基本实现音视频(nvue页面)
需求:
两人通话时可随意拖动小视频
实现原理:
uniapp的nvue内置原生插件 BindingX。具体可查看 uniapp 原生插件引入BindingX
效果展示:


项目地址:
Call_uniapp
具体实现:

1. 在实现音视频功能插件提供的视频容器外边包裹一层。

如:(使用 anyRTC 音视频插件)

<view ref="move" @touchstart="drag_start">
                <AR-CanvasView ref="location" style="flex: 1;" />
        </view>

2. 使用nvue内置插件 BindingX(uniapp已默认集成) 。

nvue内置插件,具体可查看 uniapp 原生插件引入
BindingX 效果以及相关方法可参考 BindingX

const BindingX = uni.requireNativePlugin('bindingx');

3. 实现拖拽具体方法:

1. 相关数据(nvue)

  data() {
    return {
        // 页面高宽
        windowWidth: 200,
            windowHeight: 400,
            // 记录当前位置
            position: { 
                                          x: 0,
                                          y: 0
                                  },
        // 判断是点击事件还是拖动事件      
        timer: false,
    }
  }

2. 封装 BindingX 获取拖动的元素(添加到nvue的methods)

javascript
  // 获取元素
  getEl(el) {
          if (typeof el === 'string' || typeof el === 'number') return el;
                  if (WXEnvironment) {
                          return el.ref;
                  } else {
                          return el instanceof HTMLElement ? el : el.$el;
             }
  },

3. 为可拖动元素绑定手指触发touchstart事件(添加到nvue的methods)

javascript
  drag_start(e) {
      const move = this.getEl(this.$refs.move);
      let oBindingX = BindingX.bind({
                                          anchor: move,
                                          eventType: 'pan',
                                          props: [{
                                                          element: move,
                                                          property: 'transform.translateX',
                                                          expression: `x+${this.position.x}`,
                                                  },
                                                  {
                                                          element: move,
                                                          property: 'transform.translateY',
                                                          expression: `y+${this.position.y}`,  
                                                  }
                                          ]
                                  }, (e) => {
                                          if (e.state === 'end') {
                                                  if (this.timer) { 
                              //移动时间特别短暂 视为点击事件
                                                          clearTimeout(this.timer);
                              // 点击事件处理
                                                  }
                                                  BindingX.unbind({
                                                          token: oBindingX.token,
                                                          eventType: 'pan'
                                                  })
                                                  //记录位置 
                                                  this.position.x += e.deltaX;
                                                  this.position.y += e.deltaY;
                                                  // x轴边界
                                                  if (-this.position.x >= (this.windowWidth - 193)) {
                                                          this.position.x = 193 - this.windowWidth;
                                                  }
                                                  if (this.position.x > 0) {
                                                          this.position.x = 0;
                                                  }
                                                  // y 轴边界 
                                                  if (this.position.y < 0) {
                                                          this.position.y = 0;
                                                  }
                                                  if (this.position.y >= (this.windowHeight - 244)) {
                                                          this.position.y = this.windowHeight - 244;
                                                  }
                          // 结束拖动
                                                  this.endAmaier();
                                          } else {
                          // 判断点击事件还是拖动事件
                                                  this.timer = setTimeout(() => {
                                                          this.timer = null;
                                                  }, 50)
                                          }
                                  });

  }

  // 结束拖动
  endAmaier(e) {
      const my = this.getEl(this.$refs.move);
          let result = BindingX.bind({
                                          eventType: 'timing',
                                          exitExpression: 't>200',
                                          props: [{
                                                          element: my,
                                                          property: 'transform.translateX',
                                                          expression: "easeOutElastic(t," + this.position.x + "," + 0 +
                                                                  ",200)",
                                                  },
                                                  {
                                                          element: my,
                                                          property: 'transform.translateY',
                                                          expression: "easeOutElastic(t," + this.position.y + "," + 0 +
                                                                  ",200)",
                                                  }
                                          ]
                                  }, (e) => {
                                          if (e.state === 'end' || e.state === 'exit') {
                                                  BindingX.unbind({
                                                          token: result.token,
                                                          eventType: 'timing'
                                                  })
                                          }
                                  });
  }

4. 运行项目,即可流畅拖动



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表