美文网首页
拖拽组件View,并且不移出屏幕

拖拽组件View,并且不移出屏幕

作者: sunny635533 | 来源:发表于2023-04-13 16:36 被阅读0次

需要实现组件跟随手指移动,并且不能移出屏幕,具体代码如下:

import React from 'react';
import { Image, Animated } from 'react-native';
import { PanGestureHandler, State, } from 'react-native-gesture-handler';
import ScreenUtils from '../../utils/ScreenUtils';

export class MoveView extends React.Component {
    whatsAppLayout = {};
    constructor(props) {
        super(props);
        this.translateX = new Animated.Value(0);
        this.translateY = new Animated.Value(0);
        this._lastOffset = { x: 0, y: 0 };
        this.handleGesture = Animated.event([{
            nativeEvent: {
                translationX: this.translateX,
                translationY: this.translateY,
            }
        }], { useNativeDriver: true });

        this._onGestureStateChange = (event) => {
            if (event.nativeEvent.oldState === State.ACTIVE) {
                console.log("==== _onGestureStateChange =====", event.nativeEvent)
                this._lastOffset.x += event.nativeEvent.translationX;
                this._lastOffset.y += event.nativeEvent.translationY;
                console.log("===== _lastOffset ===", this._lastOffset);

                if ((this._lastOffset.x + this.whatsAppLayout.x) <= 0) {//水平向左滑动
                    this._lastOffset.x = -(ScreenUtils.width - this.whatsAppLayout.width);
                } else if (this._lastOffset.x > 0) {//水平向后滑动
                    this._lastOffset.x = 0;
                }
                if (this._lastOffset.y + this.whatsAppLayout.y - 44 - ScreenUtils.statusBarHeight <= 0) {//竖直向上滑动
                    this._lastOffset.y = -(this.whatsAppLayout.y - 44 - ScreenUtils.statusBarHeight);
                } else if (this._lastOffset.y > (ScreenUtils.height - this.whatsAppLayout.y - this.whatsAppLayout.height)) {//竖直向下滑动
                    this._lastOffset.y = ScreenUtils.height - this.whatsAppLayout.y - this.whatsAppLayout.height;
                }

                this.translateX.setOffset(this._lastOffset.x);
                this.translateX.setValue(0);
                this.translateY.setOffset(this._lastOffset.y);
                this.translateY.setValue(0);
            }
        }
    }

    render() {
        return <PanGestureHandler onGestureEvent={this.handleGesture}
            onHandlerStateChange={this._onGestureStateChange}
            shouldCancelWhenOutside={true}>
            <Animated.View ref={(view) => this.whatsAppViewRef = view}
                style={{
                    position: 'absolute',
                    right: 0,
                    bottom: ScreenUtils.height / 5 - 16,
                    paddingTop: 15,
                    transform:
                        [{ translateX: this.translateX },
                        { translateY: this.translateY }],
                }}
                onLayout={({ nativeEvent }) => {
                    this.whatsAppLayout = nativeEvent.layout;
                }}>
                <Image source={require("@assets/activity/float_group.png")}
                    imageStyle={{ width: 78, height: 78 }} />
            </Animated.View>
        </PanGestureHandler>
    }
}

用的是react-native-gesture-handler库,_lastOffset是累计的偏移量。
手机屏幕的左上角的坐标是(0,0),所以:
_lastOffset.x 负数的话,说明是向左滑动,正数是向右滑动;
_lastOffset.y负数的话,说明是向上滑动,正数是向下滑动;

相关文章

  • 实现滑动view移出屏幕,停止滑入屏幕

    View移出移入屏幕: 获取view在屏幕中的宽高: int[] location =new int[2]; mF...

  • 小程序拖拽功能实现,以及无法点击的bug

    近些日子,遇到了一个需求,就是一个红包组件,需要可以整个屏幕拖拽,实现后整理了如下资料 小程序自带拖拽组件 #mo...

  • 2020-10-11

    一.Activity负责加载View组件并且与用户交互,所有Activity组件均继承Activity类。View...

  • WeChat小程序视图篇-view

    view 是什么? view属于微信小程序的视图容器之一。在view中可以放各种组件,并且各个组件可以组合。 如何...

  • 事件应用

    拖拽 拖拽原理 三大事件 -鼠标和Div的相对距离不变 把拖拽加到document上 如果拖得太快,会移出div,...

  • 事件应用

    拖拽 拖拽原理 三大事件 -鼠标和Div的相对距离不变 把拖拽加到document上 如果拖得太快,会移出div,...

  • Android 自定义 View 基础篇

    简介 View 和 ViewGroup View:用户界面组件的基本构成,一个 View 在屏幕上占据一个矩形,并...

  • 通过XIB自定义view并赋值的坑

    坑1、当建好view并且view上的空间拖拽完成后在view的.m文件中赋值 运行后报错如下: 解决方法:将dis...

  • Android View 和 ViewGroup详解

    View 和 ViewGroup View 是 Android 中最基本的 UI 组件,在屏幕上绘制一块矩形区域。...

  • Android 自定义View

    Android 绘图基础:Canvas、Paint、Color自定义View 需要集成View组件,并且重写其on...

网友评论

      本文标题:拖拽组件View,并且不移出屏幕

      本文链接:https://www.haomeiwen.com/subject/kwnaddtx.html