android 跟随手指移动的 view

本文介绍了一种在Android中通过手指触控来移动View的方法。使用MoveViewWithFingerTouchListener监听手指的动作,包括按下和移动,并据此更新View的位置。文章详细展示了如何在不同手指动作下调整View的位置,确保其始终在父布局内移动。
摘要由CSDN通过智能技术生成

使用方法:

**LinearLayout mLinearLayout = (LinearLayout)findViewById(R.id.ll);
mLinearLayout.setOnTouchListener(new MoveViewWithFingerTouchListener());**

package com.xxx.view;

import android.annotation.SuppressLint;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

/**
 * 
 * @Title: MoveViewWithFingerTouchListener.java
 * @Description: 跟随手指移动的 view
 * @ref  http://blog.csdn.net/jason0539/article/details/42743531
 */
@SuppressLint("ClickableViewAccessibility")
public class MoveViewWithFingerTouchListener implements View.OnTouchListener {

    private int _rawX = 0;
    private int _rawY = 0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ViewGroup parentView = (ViewGroup) v.getParent();
        int parentWidth = parentView.getWidth();
        int parentHeight = parentView.getHeight();

        // 当前手指触摸位置坐标,用于重新计算
        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_MOVE:

            // 上次和本次 手指触摸位置坐标 移动的 距离差
            int deltaX = rawX - _rawX;
            int deltaY = rawY - _rawY;

            // 上一次 控件左上角定点的位置坐标
            int _x = (int) v.getLeft();
            int _y = (int) v.getTop();

            // 目标位置 控件左上角定点的位置坐标
            int x = deltaX + _x;
            int y = deltaY + _y;

            //缓冲手指坐标
            _rawX = rawX;
            _rawY = rawY;

            // 左上 边界控制
            if (x <= 1) {
                x = 1;
            }
            if (y <= 1) {
                y = 1;
            }

            // 右下边界控制
            if (x + v.getWidth() >= parentWidth - 1) {
                x = parentWidth - v.getWidth() - 1;
            }
            if (y + v.getHeight() >= parentHeight - 1) {
                y = parentHeight - v.getHeight() - 1;
            }

            v.layout(x, y, x + v.getWidth(), y + v.getHeight());

            break;
        case MotionEvent.ACTION_DOWN:
            // 初始化首次 手指触摸点的坐标
            _rawX = (int) event.getRawX();
            _rawY = (int) event.getRawY();
            break;
        }

        return true;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值