功能一开始是需要在很多页面显示一个悬浮窗,后来改为只需要在主页显示,一开始还是用的自定义view发现完全没有必要,以下是一个简单的实现方法,只需要在清单文件中加一个ImageView,在监听触摸事件就可以了。
private boolean isRiskMove;
private int mRiskLastX;
private int mRiskLastY;
/**
* 悬浮窗的触摸和点击事件
*/
private void initFloatViewListener() {
mFloatRiskBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int x = (int) motionEvent.getRawX();
int y = (int) motionEvent.getRawY();
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
isRiskMove = true;
//计算距离上次移动了多远
int deltaX = x - mRiskLastX;
int deltaY = y - mRiskLastY;
int translationX = (int) (mFloatRiskBtn.getTranslationX() + deltaX);
int translationY = (int) (mFloatRiskBtn.getTranslationY() + deltaY);
//使mFloatRiskBtn根据手指滑动平移
mFloatRiskBtn.setTranslationX(translationX);
mFloatRiskBtn.setTranslationY(translationY);
break;
case MotionEvent.ACTION_UP:
//平移回到该view水平方向的初始点
mFloatRiskBtn.setTranslationX(0);
//判断什么情况下需要回到原点
if(mFloatRiskBtn.getY()<0 || mFloatRiskBtn.getY()>(mMainContent.getMeasuredHeight()-mFloatRiskBtn.getMeasuredHeight())) {
mFloatRiskBtn.setTranslationY(0);
}
break;
default:
break;
}
//记录上次手指离开时的位置
mRiskLastX = x;
mRiskLastY = y;
return false;
}
});
mFloatRiskBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
//判断是否是移动过,如果是移动过则不处理点击事件
if(isRiskMove){
isRiskMove=false;
return;
}
//点击要处理的操作
}
});
}
注:
1,先处理的是onTochListener(),其次是onTouchEvent,最后才是onClickListener(),所以onTouListener的返回必须为false才能使onTochListener好使。
2,motionEvent.getRawX(),为获取手指触摸到的点距离屏幕左上角的距离;
motionEvent.getX(),为获取手指按下到按下的view 的左上角的距离;
mFloatRiskBtn.getX(),为mFloatRiskBtn这个View距离屏幕左上角的距离;
mFloatRiskBtn.getTranslationX(),为获取到mFloatRiskBtn水平方向平移的距离;
getScrollX(),为获取父View左边缘和子View左边缘在水平方向的距离,向左划动为正,右为负,次方法的值是需要通过scrollTo和scrollBy方法移动才能获取到的,本例子中获取只会为0,scrollTo和scrollBy方法只能改变View内容的位置而不能改变View在布局中的位置,所以例子中没有使用该方法。
3,本例中使用的是通过属性动画移动的,如果不需要移动之后可以点击也可以使用view动画和之前说到的scrollTo 方法,但例子中没有进行兼容3.0一下的版本,如果想要兼容的话需要采用开源动画库nineoldandroids,使用时只需要替换为ViewHelper.getTranslationX(mFloatRiskBtn)和ViewHelper.setTranslationX(mFloatRiskBtn,translationX)。