@BindView(R.id.btn_save)
LinearLayout btnSave;
@BindView(R.id.btn_save_pos)
RelativeLayout btnSavePos;
// 控件上一次所处的坐标
private float lastX = 0;
private float lastY = 0;
private float beginX = 0;
private float beginY = 0;
// 屏幕的宽度和高度
private int screenWidth;
private int screenHeight;
//控件将要出现的位置
private int ll = 0;
//private int bb = 0;
//private int rr = 0;
private int tt = 0;
private int btnSize = 0;
private RelativeLayout.LayoutParams layoutParams;
// 获取屏幕的宽度和高度
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
screenWidth = windowManager.getDefaultDisplay().getWidth();
screenHeight = windowManager.getDefaultDisplay().getHeight();
btnSize = DisplayUtil.dip2px(mContext, 60);
btnSave.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("test", "down" + event.getX() + ":" + event.getY());
//获取点击时x y 轴的数据
lastX = event.getRawX();
lastY = event.getRawY();
beginX = lastX;
beginY = lastY;
break;
case MotionEvent.ACTION_UP:
Log.d("test", "up" + event.getX() + ":" + event.getY());
// 解决拖拽的时候松手点击事件触发
if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){
}else{
return true;
}
//触摸弹起的时候来一个小动画
//startAnimation();//神经病病
break;
case MotionEvent.ACTION_MOVE:
Log.d("test", "move" + event.getX() + ":" + event.getY());
//在move中直接把得到的坐标设置为控件的坐标..果然天真单纯
// v.setX(event.getX());
// v.setY(event.getY());
//获得x y轴的偏移量
int dx = (int) (event.getRawX() - lastX);
int dy = (int) (event.getRawY() - lastY);
//获得控件上下左右的位置信息,加上我们的偏移量,新得到的位置就是我们
//控件将要出现的位置
int l = v.getLeft() + dx;
int b = v.getBottom() + dy;
int r = v.getRight() + dx;
int t = v.getTop() + dy;
//判断四个实际位置,如果有一边已经划出屏幕,那就把这边位置设置为0
//然后相反的边的位置就设置成控件的高度或者宽度
if (l < 0) {
l = 0;
r = l + v.getWidth();
}
if (t < DisplayUtil.dip2px(mContext, 246)) {//根据手机的分辨率从 dp 的单位 转成为 px(像素)
t = DisplayUtil.dip2px(mContext, 246);
b = t + v.getHeight();
}
if (r > screenWidth) {
r = screenWidth;
l = r - v.getWidth();
}
if (b > screenHeight) {
b = screenHeight - DisplayUtil.dip2px(mContext, 2);
// t = b - v.getHeight();
t = b - btnSize - DisplayUtil.dip2px(mContext, 2);
// Log.e("数据接受", b + "&&&" + t);
// layoutParams = new RelativeLayout.LayoutParams(btnSavePos.getLayoutParams());
// layoutParams.width = btnSize;
// layoutParams.height = btnSize;
// layoutParams.leftMargin = l;
// layoutParams.topMargin = t;
// //这个api设置相对布局,位置的
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, R.id.btn_save_pos);
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, R.id.btn_save_pos);
// btnSave.setLayoutParams(layoutParams);
}
ll = l;
tt = t;
//然后使用我们view的layout重新在布局中把我们的控件画出来
v.layout(l, t, r, b);
//并把现在的x y设置给lastx lasty
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
// v.postInvalidate();//绘画
layoutParams = new RelativeLayout.LayoutParams(btnSavePos.getLayoutParams());
layoutParams.width = btnSize;
layoutParams.height = btnSize;
layoutParams.leftMargin = ll;
layoutParams.topMargin = tt;
// layoutParams.rightMargin = rr;
// layoutParams.bottomMargin = (int) (bb);
//这个api设置相对布局,位置的
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, R.id.btn_save_pos);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, R.id.btn_save_pos);
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, R.id.btn_save_pos);
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, R.id.btn_save_pos);
btnSave.setLayoutParams(layoutParams);
break;
default:
break;
}
return false;
}
});
布局页面
<RelativeLayout
android:id="@+id/btn_save_pos"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/btn_save"
android:layout_marginBottom="@dimen/dp_130"
android:layout_marginLeft="@dimen/dp_15"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"
android:orientation="vertical">
<TextView
android:layout_marginTop="@dimen/dp_10"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello"
android:textColor="#ffffff"
android:textSize="@dimen/sp_14" />
<TextView
android:layout_marginTop="@dimen/dp_0"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="world"
android:textColor="#ffffff"
android:textSize="@dimen/sp_12" />
</LinearLayout>
</RelativeLayout>
工具类
public class DisplayUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*
* @param pxValue
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}