0
点赞
收藏
分享

微信扫一扫

floatingAction自定义

自定义的悬浮按钮,实现可滑动,可点击响应。

先上完整代码

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;

                }


举报

相关推荐

0 条评论