功能:滑动、媳妇、设置初始位置、共享存储当前位置、设置滑动范围
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);
}
}
}
}