uniapp-【movable-area】【movable-view】

时间:2024-10-07 07:23:14
  • movable-area指代可拖动的范围,在其中内嵌movable-view组件用于指示可拖动的区域
  • 即手指/鼠标按住movable-view拖动或双指缩放,但拖不出movable-area规定的范围
  • movable-view必须在movable-area组件中,并且必须是直接子节点,否则不能移动
  • movable-view 必须设置width和height属性,不设置默认为10px
  • movable-view 默认为绝对定位,top和left属性为0px
  • 当movable-view小于movable-area时,movable-view的移动范围是在movable-area内;当movable-view大于movable-area时,movable-view的移动范围必须包含movable-area(x轴方向和y轴方向分开考虑)
属性名 类型 默认值 说明 平台差异说明
direction String none movable-view的移动方向,属性值有all、vertical、horizontal、none  
inertia Boolean false movable-view是否带有惯性 微信小程序、支付宝小程序、App、H5、百度小程序
out-of-bounds Boolean false 超过可移动区域后,movable-view是否还可以移动 微信小程序、支付宝小程序、App、H5、百度小程序
x Number / String   定义x轴方向的偏移,如果x的值不在可移动范围内,会自动移动到可移动范围;改变x的值会触发动画  
y Number / String   定义y轴方向的偏移,如果y的值不在可移动范围内,会自动移动到可移动范围;改变y的值会触发动画  
damping Number 20 阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快 微信小程序、支付宝小程序、App、H5、百度小程序
friction Number 2 摩擦系数,用于控制惯性滑动的动画,值越大摩擦力越大,滑动越快停止;必须大于0,否则会被设置成默认值 微信小程序、支付宝小程序、App、H5、百度小程序
disabled Boolean false 是否禁用  
scale Boolean false 是否支持双指缩放,默认缩放手势生效区域是在movable-view内 微信小程序、支付宝小程序、App、H5
scale-min Number 0.5 定义缩放倍数最小值 微信小程序、支付宝小程序、App、H5
scale-max Number 10 定义缩放倍数最大值 微信小程序、支付宝小程序、App、H5
scale-value Number 1 定义缩放倍数,取值范围为 0.5 - 10 微信小程序、支付宝小程序、App、H5
animation Boolean true 是否使用动画 微信小程序、支付宝小程序、App、H5、百度小程序
@change EventHandle   拖动过程中触发的事件, = {x: x, y: y, source: source},其中source表示产生移动的原因,值可为touch(拖动)、touch-out-of-bounds(超出移动范围)、out-of-bounds(超出移动范围后的回弹)、friction(惯性)和空字符串(setData)  
@scale EventHandle   缩放过程中触发的事件, = {x: x, y: y, scale: scale}, 微信小程序、App、H5、百度小程序
类型 触发条件
htouchmove 初次手指触摸后移动为横向的移动,如果catch此事件,则意味着touchmove事件也被catch
vtouchmove 初次手指触摸后移动为纵向的移动,如果catch此事件,则意味着touchmove事件也被catch

  1. <movable-area>
  2. <movable-view :x="x" :y="y" direction="all" @change="onChange">text</movable-view>
  3. </movable-area>
  4. <view @tap="tap" class="uni-link">
  5. 点击这里移动至 (30px, 30px)
  6. </view>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. x: 0,
  12. y: 0,
  13. old: {
  14. x: 0,
  15. y: 0
  16. }
  17. }
  18. },
  19. methods: {
  20. tap: function(e) {
  21. // 解决view层不同步的问题
  22. =
  23. =
  24. this.$nextTick(function() {
  25. = 30
  26. = 30
  27. })
  28. },
  29. onChange: function(e) {
  30. = e.detail.x
  31. = e.detail.y
  32. }
  33. }
  34. }
  35. </script>
  36. <style>
  37. movable-view {
  38. display: flex;
  39. align-items: center;
  40. justify-content: center;
  41. height: 150rpx;
  42. width: 150rpx;
  43. background-color: #007AFF;
  44. color: #fff;
  45. }
  46. movable-area {
  47. height: 300rpx;
  48. width: 100%;
  49. background-color: #D8D8D8;
  50. overflow: hidden;
  51. }
  52. </style>

  1. <movable-area>
  2. <movable-view class="max" direction="all">text</movable-view>
  3. </movable-area>
  4. <style>
  5. movable-area {
  6. height: 300rpx;
  7. width: 100%;
  8. background-color: #D8D8D8;
  9. overflow: hidden;
  10. }
  11. .max {
  12. width:500rpx;
  13. height: 500rpx;
  14. }
  15. </style>

  1. <movable-area>
  2. <movable-view direction="horizontal">text</movable-view>
  3. </movable-area>

  1. <movable-area>
  2. <movable-view direction="vertical">text</movable-view>
  3. </movable-area>

  1. <movable-area>
  2. <movable-view direction="all" out-of-bounds>text</movable-view>
  3. </movable-area>

  1. <movable-area>
  2. <movable-view direction="all" inertia>text</movable-view>
  3. </movable-area>

 

  1. <movable-area scale-area>
  2. <movable-view direction="all" @scale="onScale" scale scale-min="0.5" scale-max="4" :scale-value="scale">text</movable-view>
  3. </movable-area>
  4. <view @tap="tap2" class="uni-link">
  5. 点击这里放大3
  6. </view>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. scale: 2,
  12. old: {
  13. scale: 2
  14. }
  15. }
  16. },
  17. methods: {
  18. tap2() {
  19. // 解决view层不同步的问题
  20. =
  21. =
  22. this.$nextTick(function() {
  23. = 3
  24. })
  25. },
  26. onScale: function(e) {
  27. = e.detail.scale
  28. }
  29. }
  30. }
  31. </script>