安卓控件拖动和点击事件冲突处理----可拖动的FloatingActionButton

  直接上代码,具体为什么自行百度吧。额。。就是这么任性?
/**
 * Created by ${davidMa} on 2017/5/23.
 * com.aochuang.megstar.widget
 * 描述:
 * 公司:aochuang01
 */
public class MyFloatActionButton extends FloatingActionButton {
    int dx, dy;
    private int lastx, lasty;//记录手指按下去的位置
    private int startX, startY, endX, endY;
    private long startTime = 0;
    private long endTime = 0;
    private boolean isclick;

    public MyFloatActionButton(Context context) {

        super(context, null);
    }

    public MyFloatActionButton(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
    }

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

    public void init() {
        setSaveEnabled(true);
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        LogUtils.d("onSaveInstanceState satrtX=" + startX);
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);
        ss.state = startX;
        return ss;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        LogUtils.d("onRestoreInstanceState satrtX" + ((SavedState) state).state);
        super.onRestoreInstanceState(state);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:// 获取手指第一次接触屏幕
                dx = 0;
                dy = 0;
                isclick = false;//当按下的时候设置isclick为false,具体原因看后边的讲解
                startTime = System.currentTimeMillis();
                break;
            case MotionEvent.ACTION_MOVE:// 手指在屏幕上移动对应的事件
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();
                // 获取手指移动的距离
                dx = x - lastx;
                dy = y - lasty;
                setAlpha(0.5f);
                int l = getLeft();
                int r = getRight();
                int t = getTop();
                int b = getBottom();
                LogUtils.d("上面的位置是" + (l + dx) + "右边的坐标是" + (t + dy));
                // 更改在窗体的位置//确保位置显示在屏幕内
                if ((l + dx) >= 0 && (t + dy) > 0 && (r + dx) <= UIUtils.screenWidthPixels() && (b + dy) <= UIUtils.screenHeightPixels())
                    layout(l + dx, t + dy, r + dx, b + dy);
                // 获取移动后的位置
                lastx = (int) event.getRawX();
                lasty = (int) event.getRawY();
                if (Math.abs(dx) > 20 || Math.abs(dy) > 20) {
                    LogUtils.d("Math.abs(dx)>20");
                    event.setAction(MotionEvent.ACTION_CANCEL);
                    return true;
                }
            case MotionEvent.ACTION_UP:// 手指离开屏幕对应事件
                // 记录最后图片在窗体的位置
                endTime = System.currentTimeMillis();
                //当从点击到弹起小于半秒的时候,则判断为点击,如果超过则不响应点击事件
                if ((endTime - startTime) > 0.1 * 1000L) {
                    isclick = true;
                } else {
                    isclick = false;
                }
                lastx = (int) event.getRawX();
                lasty = (int) event.getRawY();
                System.out.println("执行顺序up");
                setAlpha(1.0f);

        }
        if (isclick)
            return true;
        return super.dispatchTouchEvent(event);
    }

    static class SavedState extends BaseSavedState {
        public static final Parcelable.Creator CREATOR
                = new Parcelable.Creator() {

            @Override
            public SavedState createFromParcel(Parcel source) {
                return new SavedState(source);
            }

            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
        int state;

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            state = in.readInt();
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(state);
        }
    }
}

你可能感兴趣的:(aochuang)