# movable-view

可移动的视图容器,在页面中可以拖拽滑动

# 兼容性

Web Android iOS
4.0 x x

之所以有movable-area和movable-view,是因为逻辑层和视图层分离,从视图层发送数据给逻辑层,处理后再传回视图层会产生损耗,导致拖动卡顿。

于是通过一个框架实现好的组件,在视图层内部处理拖动,避免来回通信。

在uni-app和小程序上确实存在这个问题,但在uni-app x的web和app上其实都不存在通信损耗。

在hello uni-app x里有示例,可以自由的监听view的拖动并移动其位置。详见

# 属性

名称 类型 默认值 兼容性 描述
direction string -
movable-view的移动方向,属性值有all、vertical、horizontal、none
合法值 兼容性 描述
all - -
vertical - -
horizontal - -
none - -
inertia boolean -
movable-view 是否带有惯性。
out-of-bounds boolean -
超过可移动区域后,movable-view 是否还可以移动。
x string | number -
定义 x 轴方向的偏移,如果 x 的值不在可移动范围内,会自动移动到可移动范围;改变 x 的值会触发动画。
y string | number -
定义 y 轴方向的偏移,如果 y 的值不在可移动范围内,会自动移动到可移动范围;改变 y 的值会触发动画。
damping number -
阻尼系数,用于控制 x 或 y 改变时的动画和过界回弹的动画,值越大移动越快。
friction number -
摩擦系数,用于控制惯性滑动的动画,值越大摩擦力越大,滑动越快停止;必须大于0,否则会被设置成默认值 2。
disabled boolean -
是否禁用。
scale boolean -
是否支持双指缩放,默认缩放手势生效区域是在 movable-view 内。
scale-min number -
定义缩放倍数最小值,默认为 0.5。
scale-max number -
定义缩放倍数最大值,默认为 10。
scale-value number -
定义缩放倍数,取值范围为 0.5 - 10
animation boolean -
是否使用动画,默认为 true。
@change (event: UniEvent) => void -
拖动过程中触发的事件,event.detail = {x: x, y: y, source: source}。其中source表示产生移动的原因,值可为touch(拖动)、touch-out-of-bounds(超出移动范围)、out-of-bounds(超出移动范围后的回弹)、friction(惯性)和空字符串(setData)。
@scale (event: UniEvent) => void -
缩放过程中触发的事件,event.detail = {x: x, y: y, scale: scale}。

# 示例

hello uni-app x

Template

Script

<template>
  <view class="page-body">
    <page-head title="movable-view,可拖动视图"></page-head>
    <view class="uni-padding-wrap uni-common-mt">
      <view class="uni-title uni-common-mt">
        示例 1
        <text>\nmovable-view 区域小于 movable-area</text>
      </view>
      <movable-area>
        <movable-view :x="x" :y="y" direction="all" @change="onChange">text</movable-view>
      </movable-area>
      <view @tap="tap" class="uni-link uni-center uni-common-mt">
        点击这里移动至 (30px, 30px)
      </view>
      <view class="uni-title uni-common-mt">
        示例 2
        <text>\nmovable-view区域大于movable-area</text>
      </view>
      <movable-area>
        <movable-view class="max" direction="all">text</movable-view>
      </movable-area>
      <view class="uni-title uni-common-mt">
        示例 3
        <text>\n只可以横向移动</text>
      </view>
      <movable-area>
        <movable-view direction="horizontal">text</movable-view>
      </movable-area>
      <view class="uni-title uni-common-mt">
        示例 4
        <text>\n只可以纵向移动</text>
      </view>
      <movable-area>
        <movable-view direction="vertical">text</movable-view>
      </movable-area>
      <view class="uni-title uni-common-mt">
        示例 5
        <text>\n可超出边界</text>
      </view>
      <movable-area>
        <movable-view direction="all" out-of-bounds>text</movable-view>
      </movable-area>
      <view class="uni-title uni-common-mt">
        示例 6
        <text>\n带有惯性</text>
      </view>
      <movable-area>
        <movable-view direction="all" inertia>text</movable-view>
      </movable-area>
      <view class="uni-title uni-common-mt">
        示例 7
        <text>\n可放缩</text>
      </view>
      <movable-area scale-area>
        <movable-view direction="all" @scale="onScale" scale scale-min="0.5" scale-max="4"
          :scale-value="scale">text</movable-view>
      </movable-area>
      <view @tap="tap2" class="uni-link uni-center uni-common-mt" style="padding-bottom:80rpx;">
        点击这里放大3倍
      </view>
    </view>
  </view>
</template>



<style>
  movable-view {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 150rpx;
    width: 150rpx;
    background-color: #007AFF;
    color: #fff;
  }

  movable-area {
    height: 300rpx;
    width: 100%;
    background-color: #D8D8D8;
    overflow: hidden;
  }

  .max {
    width: 500rpx;
    height: 500rpx;
  }
</style>

# 参见