Android自定义可移动悬浮按钮,最新Android大厂高频面试题

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的使用


  • 在布局文件中添加响应控件后在_MainActivity_中为其进行绑定

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)即可获取!**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值