Some checks are pending
Check / lint (push) Waiting to run
Check / typecheck (push) Waiting to run
Check / build (build, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build, 18.x, windows-latest) (push) Waiting to run
Check / build (build:app, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build:app, 18.x, windows-latest) (push) Waiting to run
Check / build (build:mp-weixin, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build:mp-weixin, 18.x, windows-latest) (push) Waiting to run
223 lines
5.2 KiB
Vue
223 lines
5.2 KiB
Vue
<template>
|
||
<!-- #ifdef MP-WEIXIN -->
|
||
<!-- <view
|
||
data-text="hehe"
|
||
@touchstart.stop="test.touchstart" @mousedown.stop="movestart" @touchmove.stop="test.touchmove" @mousemove.stop="moveing" @touchend.stop="moveend" @mouseup.stop="moveend" @mouseleave.stop="moveend"
|
||
class="absolute movable" :style="[
|
||
props.direction == 'horizontal'?{width:props.size+'rpx',height:props.size+'rpx',transform:`translateX(${_x}px)`,top:'0px'}:'',
|
||
props.direction == 'vertical'?{width:props.size+'rpx',height:props.size+'rpx',transform:`translateY(${_x}px)`,left:0+'rpx',top:'0px'}:'',
|
||
]">
|
||
<tm-sheet :followTheme="props.followTheme" :shadow="1" :border="4" :userInteractionEnabled="false" :color="props.color" :round="24" :width="props.size" :height="props.size" :margin="[0,0]" :padding="[0,0]"></tm-sheet>
|
||
</view> -->
|
||
|
||
<!-- #endif -->
|
||
|
||
<view
|
||
@touchstart.stop="movestart"
|
||
@mousedown.stop="movestart"
|
||
@touchmove.stop="moveing"
|
||
@mousemove.stop="moveing"
|
||
@touchend.stop="moveend"
|
||
@mouseup.stop="moveend"
|
||
@mouseleave.stop="moveend"
|
||
class="absolute"
|
||
:style="[
|
||
props.direction == 'horizontal'
|
||
? {
|
||
width: props.size + 'rpx',
|
||
height: props.size + 'rpx',
|
||
transform: `translateX(${_x}px)`,
|
||
top: '0px'
|
||
}
|
||
: '',
|
||
props.direction == 'vertical'
|
||
? {
|
||
width: props.size + 'rpx',
|
||
height: props.size + 'rpx',
|
||
transform: `translateY(${_x}px)`,
|
||
left: 0 + 'rpx',
|
||
top: '0px'
|
||
}
|
||
: ''
|
||
]"
|
||
>
|
||
|
||
<tm-sheet
|
||
:followTheme="props.followTheme"
|
||
:shadow="3"
|
||
:border="4"
|
||
:userInteractionEnabled="false"
|
||
:color="props.color"
|
||
:border-color="store.tmStore.dark?'black':'white'"
|
||
:round="24"
|
||
:width="props.size"
|
||
:height="props.size"
|
||
:margin="[0, 0]"
|
||
:padding="[0, 0]"
|
||
></tm-sheet>
|
||
</view>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import { useTmpiniaStore } from '@/uni_modules/tmui/tool/lib/tmpinia';
|
||
import { computed } from 'vue'
|
||
import tmSheet from '../tm-sheet/tm-sheet.vue'
|
||
|
||
const store = useTmpiniaStore();
|
||
|
||
const emits = defineEmits(['movestart', 'moveing', 'moveend'])
|
||
|
||
const props = defineProps({
|
||
//是否跟随全局主题的变换而变换
|
||
followTheme: {
|
||
type: [Boolean, String],
|
||
default: true
|
||
},
|
||
size: {
|
||
type: Number,
|
||
default: 40
|
||
},
|
||
x: {
|
||
type: Number,
|
||
dfault: 0
|
||
},
|
||
color: {
|
||
type: String,
|
||
default: 'primary'
|
||
},
|
||
/**
|
||
* 方向
|
||
* horizontal:水平,
|
||
* vertical:竖向。
|
||
*/
|
||
direction: {
|
||
type: String,
|
||
default: 'vertical'
|
||
}
|
||
})
|
||
const _x = computed(() => props.x)
|
||
let timerId = NaN
|
||
let timerId2 = NaN
|
||
function debounce(func: Function, wait = 500, immediate = false) {
|
||
// 清除定时器
|
||
if (!isNaN(timerId)) clearTimeout(timerId)
|
||
// 立即执行,此类情况一般用不到
|
||
|
||
if (immediate) {
|
||
var callNow = !timerId
|
||
timerId = setTimeout(() => {
|
||
timerId = NaN
|
||
}, wait)
|
||
|
||
if (callNow) typeof func === 'function' && func()
|
||
} else {
|
||
// 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
|
||
timerId = setTimeout(() => {
|
||
typeof func === 'function' && func()
|
||
}, wait)
|
||
}
|
||
}
|
||
|
||
function movestart(e: TouchEvent | MouseEvent) {
|
||
let etype = e.type.toLocaleLowerCase()
|
||
let ex = 0
|
||
let ey = 0
|
||
if (etype == 'mousedown') {
|
||
ex = e.pageX
|
||
ey = e.pageY
|
||
} else if (etype == 'touchstart') {
|
||
ex = e.changedTouches[0].pageX
|
||
ey = e.changedTouches[0].pageY
|
||
}
|
||
emits('movestart', { x: ex, y: ey })
|
||
}
|
||
function moveing(e: TouchEvent | MouseEvent) {
|
||
let etype = e.type.toLocaleLowerCase()
|
||
let ex = 0
|
||
let ey = 0
|
||
if (etype == 'mousemove') {
|
||
ex = e.pageX
|
||
ey = e.pageY
|
||
} else if (etype == 'touchmove') {
|
||
ex = e.changedTouches[0].pageX
|
||
ey = e.changedTouches[0].pageY
|
||
}
|
||
debounce(
|
||
() => {
|
||
emits('moveing', { x: ex, y: ey })
|
||
},
|
||
5,
|
||
false
|
||
)
|
||
e.preventDefault()
|
||
e.stopPropagation()
|
||
}
|
||
function moveend(e: TouchEvent | MouseEvent) {
|
||
let etype = e.type.toLocaleLowerCase()
|
||
let ex = 0
|
||
let ey = 0
|
||
if (etype == 'mouseup' || etype == 'mouseleave') {
|
||
ex = e.pageX
|
||
ey = e.pageY
|
||
} else if (etype == 'touchend') {
|
||
ex = e.changedTouches[0].pageX
|
||
ey = e.changedTouches[0].pageY
|
||
}
|
||
emits('moveend', { x: ex, y: ey })
|
||
}
|
||
</script>
|
||
<script lang="ts">
|
||
export default {
|
||
data() {
|
||
return {
|
||
|
||
}
|
||
},
|
||
mounted() {}
|
||
}
|
||
</script>
|
||
|
||
<script module="test" lang="wxs">
|
||
// 暂时用不了.uni官方不支持setup中使用wsx,使用了可以,但无法使用模板变量.
|
||
var startX = 0
|
||
var startY = 0
|
||
var lastLeft = 0; var lastTop = 0
|
||
function setDefaultXY(x,y){
|
||
// lastLeft = x;
|
||
return x
|
||
}
|
||
function touchstart(event, ins) {
|
||
console.log(JSON.stringify(ins.selectComponent('.movable')))
|
||
|
||
var touch = event.touches[0] || event.changedTouches[0]
|
||
startX = touch.pageX
|
||
startY = touch.pageY
|
||
}
|
||
function touchmove(event, ins) {
|
||
var touch = event.touches[0] || event.changedTouches[0]
|
||
var pageX = touch.pageX
|
||
var pageY = touch.pageY
|
||
var left = pageX - startX + lastLeft
|
||
var top = pageY - startY + lastTop
|
||
startX = pageX
|
||
startY = pageY
|
||
lastLeft = left
|
||
lastTop = top
|
||
|
||
ins.selectComponent('.movable').setStyle({
|
||
left: left + 'px',
|
||
// top: top + 'px'
|
||
})
|
||
return false
|
||
}
|
||
function touchend(event, ins) {
|
||
|
||
}
|
||
module.exports = {
|
||
setDefaultXY:setDefaultXY,
|
||
lastLeft: lastLeft,
|
||
touchstart: touchstart,
|
||
touchmove: touchmove
|
||
}
|
||
</script>
|