简体中文
可移动的视图容器,在页面中可以拖拽滑动
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 | ||||||||||||||||
| |||||||||||||||||||
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}。 |
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>