项目中遇到一个可随意跟随手指拖动的电话按钮,网上一搜基本上都是,先在布局文件中写一个button或ImageView,然后找到这个控件,重写ontouch方法,并不是我想要的,然后就自定义一个可随手机拖动的View。
我这里是集成ImageView写的,大家要使用时,可随意集成某个控件来写。其实也是很简单好实现的,原理就是重写控件本身onTouchEvent,然后在move方法中,让其跟随触摸拖动的动作滑动。 这里主要解决两个问题:①避免手指拖动时触发其点击事件问题;
② 滑出边缘的问题。
先看一下效果
- 为了避免滑出手机屏幕边界,首先要获取手机屏幕宽高
获取手机屏幕宽高的工具类
class ScreenUtils {
/**
* 获取手机屏幕大小
*
* @author
*/
public static int getWidth(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
/**
* 高
*
* @return
*/
public static int getHeight(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.heightPixels;
}
- 自定义view最主要的部分,重写本身的onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
movex = lastX;
movey = lastY;
break;
case MotionEvent.ACTION_MOVE:
dx = (int) event.getRawX() - lastX;
dy = (int) event.getRawY() - lastY;
int left = getLeft() + dx;
int top = getTop() + dy;
int right = getRight() + dx;
int bottom = getBottom() + dy;
if (left < 0) {
left = 0;
right = left + getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - getWidth();
}
if (top < 0) {
top = 0;
bottom = top + getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - getHeight();
}
layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.onTouchEvent(event);
}
- 一般这样这个自定义控件就能够跟随手机随意拖动了,但你要是添加点击事件后,拖动就会触发点击事件,这里就需要简单处理一下。
在MotionEvent.ACTION_UP中做下处理
case MotionEvent.ACTION_UP:
//避免滑出触发点击事件
if ((int) (event.getRawX() - movex) != 0
|| (int) (event.getRawY() - movey) != 0) {
return true;
}
break;
到这一个简单的自定义随手指随意拖动的ImageView就已经实现了!