非常简单的手势拖动得自定义View

package com.example.myapplication.initview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Created by pw on 2019/3/27 13:28
 * E-Mail Address: pw163.com
 */
@SuppressLint("AppCompatCustomView")
public class MyImageView extends ImageView {
    private final Context context;
    private boolean isDrag = false;
    private int measuredWidth;
    private int measuredHeight;
    private int maxHeight;
    private int maxWidth;
    private float downx;
    private float downy;
    int l, r, t, b;  //上下左右四个点偏移量


    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    //判断是否可以滑动
    public boolean isDrag() {
        return isDrag;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        /**
         *  获取屏幕宽高
         */
        measuredWidth = getMeasuredWidth();  //获取控件得宽度
        measuredHeight = getMeasuredHeight(); // 获取控件高度
        maxWidth = UiUtil.getMaxWidth(context);  //屏幕得宽度
        maxHeight = UiUtil.getMaxHeight(context); //屏幕得高度
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (this.isEnabled()) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    setPressed(true);
                    isDrag = false;
                    downx = event.getX();
                    downy = event.getY();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    setPressed(true);
                    float mx = event.getX() - downx;
                    float my = event.getY() - downy;

                    //判断点击事件和滑动事件 3 时候为点击事件得峰值
                    if (Math.abs(mx) > 3 || Math.abs(my) > 3) {
                        l = (int) (getLeft() + mx);
                        r = l + measuredWidth;
                        t = (int) (getTop() + my);
                        b = t + measuredHeight;
                        /**
                         *  让我们可滑动得控件在可控范围内
                         */
                        if (l < 0) {
                            l = 0;
                            r = l + measuredWidth;
                        } else if (r > maxWidth) {
                            r = maxWidth;
                            l = r - measuredWidth;
                        }
                        if (t < 0) {
                            t = 0;
                            b = t + measuredHeight;
                        } else if (b > maxHeight) {
                            b = maxHeight;
                            t = b - measuredHeight;
                        }
                        layout(l,t,r,b);
                        isDrag = true;
                    } else {
                        isDrag = false;
                    }
                    return true;
                case MotionEvent.ACTION_UP:
                    setPressed(false);
                    return true;

                default:
                    return super.onTouchEvent(event);
            }
        }
        return super.onTouchEvent(event);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值