Android 实现可拖动的ImageView

Android 实现可拖动的ImageView


代码实现:

java 复制代码
public class DraggableImageView extends AppCompatImageView {

    private float lastTouchX;
    private float lastTouchY;

    public DraggableImageView(Context context) {
        super(context);
        init();
    }

    public DraggableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DraggableImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setClickable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int action = event.getActionMasked();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                lastTouchX = event.getRawX();
                lastTouchY = event.getRawY();
                break;

            case MotionEvent.ACTION_MOVE:
                float x = event.getRawX();
                float y = event.getRawY();

                x = Math.max(0,x);
                y = Math.max(0,y);


                float dx = x - lastTouchX;
                float dy = y - lastTouchY;
				//边界控制
                ViewGroup pa = (ViewGroup) getParent();
                float lx = Math.max(0,dx+getX());
                float ly = Math.max(0,dy+getY());
                lx = Math.min(lx,pa.getWidth()-getWidth());
                ly = Math.min(ly,pa.getHeight()-getHeight());

                setX(lx);
                setY(ly);



                lastTouchX = x;
                lastTouchY = y;
                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;

            case MotionEvent.ACTION_POINTER_UP:

                lastTouchX = event.getRawX();
                lastTouchY = event.getRawX();
                break;
        }
        return true;
    }
}
相关推荐
圆号本昊16 分钟前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑1 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf2 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者2 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql
liang_jy4 小时前
Android 事件分发机制(一)—— 全流程源码解析
android·面试·源码
峥嵘life5 小时前
2026 Android EDLA 认证相关资源网址汇总(持续更新)
android·java·学习
kkk_皮蛋5 小时前
在移动端使用 WebRTC (Android/iOS)
android·ios·webrtc
aqi006 小时前
FFmpeg开发笔记(九十六)采用Kotlin+Compose的视频编辑器OpenVideoEditor
android·ffmpeg·kotlin·音视频·流媒体
诸神黄昏EX7 小时前
Android Safety 系列专题【篇一:系统签名】
android
ll_god7 小时前
android gradle中如何引用 libs.versions.toml中定义的版本变量添加compose引用
android