chat-app/src/uni_modules/tmui/components/tm-slider/slider-button.vue
scout b54bfe63ad
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
init
2024-11-11 14:46:14 +08:00

223 lines
5.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>