3.20MayBeAndroid

invalidate里放着ONDRAW的方法,当调用I时,会自动更新图片

如果上次记录的位置在-1,那么就更新为现在的位置,更新后就不再为-1了,就不再变了

也就是说是保留第一次触碰到的位置

复制代码
public class CustomView extends View {
    private int mLastX, mLastY;
    private boolean isDragging = false;

    public CustomView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        int currX = (int) event.getX();
        int currY = (int) event.getY();

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (event.getPointerCount() == 1) {
                    isDragging = true;
                }
                mLastX = currX;
                mLastY = currY;
                break;

            case MotionEvent.ACTION_MOVE:
                if (isDragging) {
                    int dx = currX - mLastX;
                    int dy = currY - mLastY;

                    // 拖拽
                    int left = getLeft() + dx;
                    int top = getTop() + dy;
                    int right = getRight() + dx;
                    int bottom = getBottom() + dy;
                    layout(left, top, right, bottom);
                } else {
                    int dx = currX - mLastX;
                    int dy = currY - mLastY;

                    // 拉伸
                    ViewGroup.LayoutParams layoutParams = getLayoutParams();
                    layoutParams.width += dx;
                    layoutParams.height += dy;
                    setLayoutParams(layoutParams);
                }

                mLastX = currX;
                mLastY = currY;
                break;

            case MotionEvent.ACTION_UP:
                isDragging = false;
                break;
        }

        return true;
    }
}

public class CustomView extends View {
    private int mLastX, mLastY;
    private boolean isDragging = false;
    private boolean isScaling = false;
    private float initialDistance;

    public CustomView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        int currX = (int) event.getX();
        int currY = (int) event.getY();

        switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                if (event.getPointerCount() == 1) {
                    isDragging = true;
                }
                mLastX = currX;
                mLastY = currY;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                if (event.getPointerCount() == 2) {
                    isDragging = false;
                    isScaling = true;
                    initialDistance = getDistance(event);
                }
                break;

            case MotionEvent.ACTION_MOVE:
                if (isDragging) {
                    int dx = currX - mLastX;
                    int dy = currY - mLastY;

                    // 拖拽
                    int left = getLeft() + dx;
                    int top = getTop() + dy;
                    int right = getRight() + dx;
                    int bottom = getBottom() + dy;
                    layout(left, top, right, bottom);
                } else if (isScaling) {
                    float currentDistance = getDistance(event);
                    float scale = currentDistance / initialDistance;

                    // 拉伸
                    ViewGroup.LayoutParams layoutParams = getLayoutParams();
                    layoutParams.width *= scale;
                    layoutParams.height *= scale;
                    setLayoutParams(layoutParams);
                }

                break;

            case MotionEvent.ACTION_POINTER_UP:
                if (event.getPointerCount() == 2) {
                    isScaling = false;
                }
                break;

            case MotionEvent.ACTION_UP:
                isDragging = false;
                isScaling = false;
                break;
        }

        return true;
    }

    private float getDistance(MotionEvent event) {
        float dx = event.getX(0) - event.getX(1);
        float dy = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(dx * dx + dy * dy);
    }
}
相关推荐
瑞雪兆丰年兮3 分钟前
[从0开始学Java|第十三天]面向对象进阶(static&继承)
java·开发语言
小楼v5 分钟前
如何实现AI生成应用部署功能
java·后端·ai·部署
望未来无悔7 分钟前
系统学习算法 专题十九 优先级队列(堆)
java·算法
小虾米 ~8 分钟前
JAVA引用类型
java·开发语言
星辰_mya9 分钟前
Elasticsearch之中
java·服务器·数据库
lly20240612 分钟前
C++ 循环
开发语言
fengxin_rou13 分钟前
[Redis从零到精通|第三篇]:缓存更新指南
java·数据库·redis·spring·缓存
九转成圣17 分钟前
告别肉眼解析!Java 递归实现 JSON 全路径自动化探测工具
java·自动化·json
_运维那些事儿17 分钟前
skywalking链路追踪
java·运维·ci/cd·软件构建·skywalking·devops
范纹杉想快点毕业18 分钟前
状态机设计模式与嵌入式系统开发完整指南
java·开发语言·网络·数据库·mongodb·设计模式·架构