自定义的悬浮按钮,实现可滑动,可点击响应。
先上完整代码
public class TmmFloatingActionBtn extends FloatingActionButton {
float startX, startY,startScrollX, startScrollY,endScrollX,endScrollY;
Scroller scroller;
Context context;
public TmmFloatingActionBtn(Context context) {
this(context,null);
}
public TmmFloatingActionBtn(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public TmmFloatingActionBtn(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
scroller =new Scroller(context);
this.context=context;
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()){
((View)getParent()).scrollTo(scroller.getCurrX(),scroller.getCurrY());
invalidate();
}
super.computeScroll();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent mv) {
View parent= (View)getParent();
switch (mv.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = mv.getX();
startY = mv.getY();
startScrollX=parent.getScrollX();
startScrollY=parent.getScrollY();
break;
case MotionEvent.ACTION_MOVE:
int upX = (int) (mv.getX() - startX);
int upY = (int) (mv.getY() - startY);
parent.scrollBy(-upX, -upY);
break;
case MotionEvent.ACTION_UP:
endScrollX= parent.getScrollX();
endScrollY= parent.getScrollY();
// if (parent.getScrollX()>500||parent.getScrollY()>500) {
// scroller.startScroll(parent.getScrollX(),parent.getScrollY(),-parent.getScrollX(),-parent.getScrollY(),1000);
// }
invalidate();
if(Math.abs(endScrollX-startScrollX)>5||Math.abs(endScrollY-startScrollY)>5){
Log.i("ttt","悬浮按钮移动了距离");
return true;
}
break;
}
return super.onTouchEvent(mv);
}
}
构造器使用了 this传递
public TmmFloatingActionBtn(Context context) { this(context,null); }
public TmmFloatingActionBtn(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public TmmFloatingActionBtn(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
scroller =new Scroller(context);
this.context=context;
}
在onTouchEvent中调用 mv.getX() 发现 因为移动了父控件的缘故,会导致无法获取当前位置。无法计算移动事件。所以这里定义了startScrollX, startScrollY,endScrollX,endScrollY。
通过代码计算,判断是否移动,移动了就拦截事件不传递,以免java代码调用onClick事件再次触发
if(Math.abs(endScrollX-startScrollX)>5||Math.abs(endScrollY-startScrollY)>5){
Log.i("ttt","悬浮按钮移动了距离");
return true;
}