super(context, attrs);
}
public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private int lastX;
private int lastY;
private boolean isDrag;
@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
setPressed(true);
isDrag=false;
getParent().requestDisallowInterceptTouchEvent(true);
lastX=rawX;
lastY=rawY;
ViewGroup parent;
if(getParent()!=null){
parent= (ViewGroup) getParent();
parentHeight=parent.getHeight();
parentWidth=parent.getWidth();
}
break;
case MotionEvent.ACTION_MOVE:
if(parentHeight<=0||parentWidth==0){
isDrag=false;
break;
}else {
isDrag=true;
}
//计算手指移动了多少
int dx=rawX-lastX;
int dy=rawY-lastY;
//这里修复一些华为手机无法触发点击事件
int distance= (int) Math.sqrt(dxdx+dydy);
if(distance==0){
isDrag=false;
break;
}
float x=getX()+dx;
float y=getY()+dy;
//检测是否到达边缘 左上右下
x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;
y=getY()<0?0:getY()+getHeight()>parentHeight?parentHeight-getHeight():y;
setX(x);
setY(y);
lastX=rawX;
lastY=rawY;
Log.i(“aa”,“isDrag=”+isDrag+“getX=”+getX()+";getY="+getY()+";parentWidth="+parentWidth);
break;
case MotionEvent.ACTION_UP:
if(!isNotDrag()){
//恢复按压效果
setPressed(false);
//Log.i(“getX=”+getX()+";screenWidthHalf="+screenWidthHalf);
/* animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.start();*/
if(rawX>=parentWidth/2){
//靠右吸附
animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.xBy(parentWidth-getWidth()-getX())
.start();
}else {
//靠左吸附
ObjectAnimator oa=ObjectAnimator.ofFloat(this,“x”,getX(),0);
oa.setInterpolator(new DecelerateInterpolator());
oa.setDuration(500);
oa.start();
}
}
break;
}
//如果是拖拽则消s耗事件,否则正常传递即可。
return !isNotDrag() || super.onTouchEvent(event);
return ev.getAction() != MotionEvent.ACTION_UP && (mIsDrag || super.onTouchEvent(ev));
}
private boolean isNotDrag(){
return !isDrag&&(getX()==0
||(getX()==parentWidth-getWidth()));
}
}
DragFloatActionButton的使用
FloatingActionButton imageButton;
imageButton= (DragFloatActionButton)findViewById(R.id.fb);
同时必须 添加按钮点击事件,触发 onTouchEvent 函数
使按钮能被拖拽移动
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//添加要响应的内容
…
}
**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】点击:Android架构视频+BAT面试专题PDF+学习笔记即可获取!
Android架构视频+BAT面试专题PDF+学习笔记](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)即可获取!**