// 🎯 交互反馈组件逻辑 const animationManager = require('../../utils/animation-manager.js'); Component({ properties: { // 反馈类型 feedbackType: { type: String, value: 'button' // button, card, list-item, icon, floating }, // 是否启用波纹效果 ripple: { type: Boolean, value: true }, // 波纹颜色 rippleColor: { type: String, value: 'primary' // primary, white, dark }, // 触摸反馈类型 touchFeedback: { type: String, value: 'overlay' // overlay, highlight, glow, none }, // 是否启用缩放效果 scaleEffect: { type: Boolean, value: true }, // 缩放类型 scaleType: { type: String, value: 'normal' // normal, large, none }, // 是否禁用 disabled: { type: Boolean, value: false }, // 加载状态 loading: { type: Boolean, value: false, observer: 'onLoadingChange' }, // 主题 theme: { type: String, value: 'default' // default, primary, success, error, ghost, minimal }, // 特殊效果 effect: { type: String, value: 'none' // none, glass, neon, gradient, hover-lift, hover-glow } }, data: { // 反馈状态 pressed: false, active: false, // 波纹数据 ripples: [], showRipple: false, // 触摸反馈 showTouchFeedback: false, touchFeedbackClass: '', touchFeedbackStyle: '', // 动画数据 animationData: null, loadingAnimation: null, successAnimation: null, errorAnimation: null, // 样式 feedbackStyle: '', feedbackClass: '', // 状态反馈 showSuccess: false, showError: false, // 定时器 rippleTimer: null, feedbackTimer: null }, lifetimes: { attached() { console.log('🎯 交互反馈组件加载'); this.initComponent(); }, detached() { console.log('🎯 交互反馈组件卸载'); this.cleanup(); } }, methods: { // 初始化组件 initComponent() { this.updateFeedbackClass(); this.updateTouchFeedbackClass(); this.createLoadingAnimation(); }, // 加载状态变化处理 onLoadingChange(loading) { if (loading) { this.startLoadingAnimation(); } else { this.stopLoadingAnimation(); } }, // 🎯 ===== 触摸事件处理 ===== // 触摸开始 onTouchStart(e) { if (this.properties.disabled || this.properties.loading) { return; } console.log('🎯 触摸开始'); this.setData({ pressed: true }); // 显示触摸反馈 this.showTouchFeedbackEffect(); // 创建波纹效果 if (this.properties.ripple) { this.createRipple(e); } // 缩放效果 if (this.properties.scaleEffect) { this.applyScaleEffect(true); } this.triggerEvent('touchstart', e); }, // 触摸结束 onTouchEnd(e) { if (this.properties.disabled || this.properties.loading) { return; } console.log('🎯 触摸结束'); this.setData({ pressed: false }); // 隐藏触摸反馈 this.hideTouchFeedbackEffect(); // 恢复缩放 if (this.properties.scaleEffect) { this.applyScaleEffect(false); } this.triggerEvent('touchend', e); }, // 触摸取消 onTouchCancel(e) { if (this.properties.disabled || this.properties.loading) { return; } console.log('🎯 触摸取消'); this.setData({ pressed: false }); // 隐藏触摸反馈 this.hideTouchFeedbackEffect(); // 恢复缩放 if (this.properties.scaleEffect) { this.applyScaleEffect(false); } this.triggerEvent('touchcancel', e); }, // 点击事件 onTap(e) { if (this.properties.disabled || this.properties.loading) { return; } console.log('🎯 点击事件'); // 按钮点击动画 this.playButtonPressAnimation(); this.triggerEvent('tap', e); }, // 长按事件 onLongPress(e) { if (this.properties.disabled || this.properties.loading) { return; } console.log('🎯 长按事件'); // 长按反馈 this.playLongPressFeedback(); this.triggerEvent('longpress', e); }, // 🌊 ===== 波纹效果 ===== // 创建波纹 createRipple(e) { const touch = e.touches[0]; if (!touch) return; // 获取组件位置信息 this.createSelectorQuery() .select('.interactive-feedback-container') .boundingClientRect((rect) => { if (!rect) return; // 计算波纹位置 const x = touch.clientX - rect.left; const y = touch.clientY - rect.top; // 计算波纹大小 const size = Math.max(rect.width, rect.height) * 2; // 创建波纹数据 const ripple = { id: this.generateRippleId(), class: `${this.properties.rippleColor} animate`, style: ` left: ${x - size / 2}px; top: ${y - size / 2}px; width: ${size}px; height: ${size}px; `, animation: null }; // 添加波纹 const ripples = [...this.data.ripples, ripple]; this.setData({ ripples: ripples, showRipple: true }); // 清理波纹 this.rippleTimer = setTimeout(() => { this.removeRipple(ripple.id); }, 600); }) .exec(); }, // 移除波纹 removeRipple(rippleId) { const ripples = this.data.ripples.filter(ripple => ripple.id !== rippleId); this.setData({ ripples: ripples, showRipple: ripples.length > 0 }); }, // 清理所有波纹 clearRipples() { this.setData({ ripples: [], showRipple: false }); }, // 📱 ===== 触摸反馈 ===== // 显示触摸反馈 showTouchFeedbackEffect() { if (this.properties.touchFeedback === 'none') return; this.setData({ showTouchFeedback: true, touchFeedbackClass: `${this.properties.touchFeedback} active` }); }, // 隐藏触摸反馈 hideTouchFeedbackEffect() { this.setData({ showTouchFeedback: false, touchFeedbackClass: this.properties.touchFeedback }); }, // 🎭 ===== 动画效果 ===== // 应用缩放效果 applyScaleEffect(pressed) { if (!this.properties.scaleEffect) return; let scale = 1; if (pressed) { switch (this.properties.scaleType) { case 'large': scale = 1.02; break; case 'none': scale = 1; break; case 'normal': default: scale = 0.98; break; } } const animation = animationManager.scale(scale, { duration: 150, timingFunction: 'ease-out' }); this.setData({ animationData: animation.export() }); }, // 播放按钮点击动画 playButtonPressAnimation() { const animation = animationManager.buttonPress({ duration: 200 }); this.setData({ animationData: animation.export() }); }, // 播放长按反馈 playLongPressFeedback() { const animation = animationManager.pulse({ duration: 300 }); this.setData({ animationData: animation.export() }); }, // 🔄 ===== 加载动画 ===== // 创建加载动画 createLoadingAnimation() { const loadingAnimation = animationManager.loadingSpinner({ duration: 1000 }); this.setData({ loadingAnimation: loadingAnimation.export() }); }, // 开始加载动画 startLoadingAnimation() { this.loadingTimer = setInterval(() => { const loadingAnimation = animationManager.loadingSpinner({ duration: 1000 }); this.setData({ loadingAnimation: loadingAnimation.export() }); }, 1000); }, // 停止加载动画 stopLoadingAnimation() { if (this.loadingTimer) { clearInterval(this.loadingTimer); this.loadingTimer = null; } }, // ✅ ===== 状态反馈 ===== // 显示成功反馈 showSuccessFeedback(duration = 1500) { console.log('✅ 显示成功反馈'); this.setData({ showSuccess: true }); const successAnimation = animationManager.bounceIn({ duration: 500 }); this.setData({ successAnimation: successAnimation.export() }); // 自动隐藏 setTimeout(() => { this.hideSuccessFeedback(); }, duration); }, // 隐藏成功反馈 hideSuccessFeedback() { this.setData({ showSuccess: false }); }, // 显示错误反馈 showErrorFeedback(duration = 1500) { console.log('❌ 显示错误反馈'); this.setData({ showError: true }); const errorAnimation = animationManager.shake({ duration: 500 }); this.setData({ errorAnimation: errorAnimation.export() }); // 自动隐藏 setTimeout(() => { this.hideErrorFeedback(); }, duration); }, // 隐藏错误反馈 hideErrorFeedback() { this.setData({ showError: false }); }, // 🎨 ===== 样式管理 ===== // 更新反馈类 updateFeedbackClass() { let feedbackClass = this.properties.feedbackType; if (this.properties.theme !== 'default') { feedbackClass += ` theme-${this.properties.theme}`; } if (this.properties.effect !== 'none') { feedbackClass += ` ${this.properties.effect}`; } if (this.properties.disabled) { feedbackClass += ' disabled'; } if (this.properties.loading) { feedbackClass += ' loading'; } if (this.data.pressed) { feedbackClass += ' pressed'; } if (this.data.active) { feedbackClass += ' active'; } this.setData({ feedbackClass: feedbackClass }); }, // 更新触摸反馈类 updateTouchFeedbackClass() { this.setData({ touchFeedbackClass: this.properties.touchFeedback }); }, // 🔧 ===== 工具方法 ===== // 生成波纹ID generateRippleId() { return `ripple_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; }, // 设置激活状态 setActive(active) { this.setData({ active: active }); this.updateFeedbackClass(); }, // 触发成功状态 triggerSuccess() { this.showSuccessFeedback(); this.triggerEvent('success'); }, // 触发错误状态 triggerError() { this.showErrorFeedback(); this.triggerEvent('error'); }, // 重置状态 reset() { this.setData({ pressed: false, active: false, showSuccess: false, showError: false }); this.clearRipples(); this.hideTouchFeedbackEffect(); this.updateFeedbackClass(); }, // 清理资源 cleanup() { if (this.rippleTimer) { clearTimeout(this.rippleTimer); this.rippleTimer = null; } if (this.feedbackTimer) { clearTimeout(this.feedbackTimer); this.feedbackTimer = null; } this.stopLoadingAnimation(); this.clearRipples(); } } });