Androidカスタムコントロールのスライド吸着可能buttonボタン


機能:スライド、嫁、初期位置の設定、現在位置の共有、スライド範囲の設定


import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.widget.Button;

/**
 * Created by wangliang on 0027/2016/9/27.
 */
public class MoveButton extends Button {
    private int screenWidth;
    private int screenHeight;

    private Integer defaultLeft;
    private Integer defaultTop;
    private Integer defaultRight;
    private Integer defaultBottom;

    public MoveButton(Context context) {
        super(context);
        DisplayMetrics dm=getResources().getDisplayMetrics();
        screenWidth=dm.widthPixels;
        screenHeight=dm.heightPixels;
    }

    public MoveButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        DisplayMetrics dm=getResources().getDisplayMetrics();
        screenWidth=dm.widthPixels;
        screenHeight=dm.heightPixels;
    }

    public MoveButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        DisplayMetrics dm=getResources().getDisplayMetrics();
         screenWidth=dm.widthPixels;
         screenHeight=dm.heightPixels;
    }

    public void setLocation(int l, int t, int r, int b){
        this.defaultLeft = l;
        this.defaultTop = t;
        this.defaultRight = r;
        this.defaultBottom = b;
    }

    public void setScreenCcope(int screenWidth,int screenHeight){
        this.screenWidth = screenWidth;
        this.screenHeight = screenHeight;
    }

    int lastX,lastY;
    int downX,downY;
    private boolean whetherScroll = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
            lastX=(int)event.getRawX();// X 
            lastY=(int)event.getRawY();
            downX=(int)event.getRawX();// X 
            downY=(int)event.getRawY();
            break;

            case MotionEvent.ACTION_MOVE:
                int dx=(int)event.getRawX()-lastX;
                int dy=(int)event.getRawY()-lastY;

                if(Math.abs(event.getRawX() - downX) < 10 && Math.abs(event.getRawY() - downY) < 10){
                    setEnabled(true);
                    return super.onTouchEvent(event);
                }

                setEnabled(false);

                int l=getLeft()+dx;
                int b=getBottom()+dy;
                int r=getRight()+dx;
                int t=getTop()+dy;


                // 
                if(l<0){
                    l=0;
                    r=l+getWidth();
                }

                if(t<0){
                    t=0;
                    b=t+getHeight();
                }

                if(r>screenWidth){
                    r=screenWidth;
                    l=r-getWidth();
                }

                if(b > screenHeight){
                    b=screenHeight;
                    t=b - getHeight();
                }
                whetherFirstCreateView = false;
                layout(l, t, r, b);

                lastX=(int)event.getRawX();
                lastY=(int)event.getRawY();
                postInvalidate();
                whetherScroll = true;
                break;
            case MotionEvent.ACTION_UP:
                if(Math.abs(event.getRawX() - downX) < 10 && Math.abs(event.getRawY() - downY) < 10){
                    setEnabled(true);
                    return super.onTouchEvent(event);
                }

                dx=(int)event.getRawX()-lastX;
                dy=(int)event.getRawY()-lastY;
                l=getLeft()+dx;
                b=getBottom()+dy;
                r=getRight()+dx;
                t=getTop()+dy;
                if(l <= screenWidth - getWidth() - l) {
                    layout(0, t, getWidth(), b);
                    SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_LEFT,0);
                    SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_RIGHT,getWidth());
                }else {
                    layout(screenWidth - getWidth(), t, screenWidth, b);
                    SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_LEFT,screenWidth - getWidth());
                    SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_RIGHT,screenWidth);
                }
                setEnabled(true);
                SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_TOP,t);
                SharedPrefUtils.putInt(AppCommon.MOVE_BUTTON_LOCATION_BOTTOM,b);
                whetherScroll = false;
                return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    boolean whetherFirstCreateView = true;
    @Override
    public void layout(int l, int t, int r, int b) {
        if(whetherFirstCreateView && defaultLeft != null && defaultTop != null && defaultRight != null && defaultBottom != null){
            super.layout(defaultLeft, defaultTop, defaultRight, defaultBottom);
        }else {
            if(whetherScroll && t != 0) {// 
                super.layout(l, t, r, b);
            }
        }
    }
}