当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现跟随手指拖动并自动贴边的View样式(实例demo)

Android实现跟随手指拖动并自动贴边的View样式(实例demo)

2019年07月24日  | 移动技术网移动技术  | 我要评论

效果图

代码

/**
 * 根据手指拖动的当前位置,自动贴边的view
 */
public class dragview extends imageview implements view.ontouchlistener{
 private int screenwidth;
 private int screenheight;
 private context mcontext;
 private int lastx, lasty;
 private int left ,top;
 private viewgroup.marginlayoutparams layoutparams;
 private int startx;
 private int endx;
 private boolean ismoved = false;
 private ondragviewclicklistener mlister;
 public interface ondragviewclicklistener{
  void ondragviewclick();
 }
 public void setondragviewclicklistener(ondragviewclicklistener listener){
  this.mlister = listener;
 }
 public dragview(context context) {
  this(context,null);
 }
 public dragview(context context, attributeset attrs) {
  super(context, attrs);
  mcontext = context;
  displaymetrics displaymetrics = getresources().getdisplaymetrics();
  screenwidth = displaymetrics.widthpixels;
  screenheight = displaymetrics.heightpixels-getstatusbarheight();
  init();
 }
 public void init(){
  setontouchlistener(this);
  post(new runnable() {
   @override
   public void run() {
    layoutparams = (viewgroup.marginlayoutparams)getlayoutparams();
    layoutparams.topmargin = screenheight - getheight();
    layoutparams.leftmargin = screenwidth - getwidth();
    setlayoutparams(layoutparams);
   }
  });
 }
 @override
 public boolean ontouch(view v, motionevent event) {
  switch (event.getaction()) {
   case motionevent.action_down:
    lastx = (int) event.getrawx();
    lasty = (int) event.getrawy();
    startx = lastx;
    break;
   case motionevent.action_move:
    ismoved = true;
    int dx = (int) event.getrawx() - lastx;
    int dy = (int) event.getrawy() - lasty;
    left = v.getleft() + dx;
    top = v.gettop() + dy;
    int right = v.getright() + dx;
    int bottom = v.getbottom() + dy;
    // 设置不能出界
    if (left < 0) {
     left = 0;
     right = left + v.getwidth();
    }
    if (right > screenwidth) {
     right = screenwidth;
     left = right - v.getwidth();
    }
    if (top < 0) {
     top = 0;
     bottom = top + v.getheight();
    }
    if (bottom > screenheight) {
     bottom = screenheight;
     top = bottom - v.getheight();
    }
    v.layout(left, top, right, bottom );
    lastx = (int) event.getrawx();
    lasty = (int) event.getrawy();
    break;
   case motionevent.action_up:
    //只有滑动改变上边距时,抬起才进行设置
    if (ismoved) {
     layoutparams = (viewgroup.marginlayoutparams)getlayoutparams();
     layoutparams.topmargin = top;
     setlayoutparams(layoutparams);
    }
    endx = (int) event.getrawx();
    //滑动距离比较小,当作点击事件处理
    if (math.abs(startx - endx) < 6) {
     return false;
    }
    if (left +v.getwidth()/2 < screenwidth/2) {
     startscroll(left,screenwidth/2,true);
    } else {
     startscroll(left,screenwidth/2,false);
    }
    break;
  }
  return true;
}
 //在此处理点击事件
 @override
 public boolean ontouchevent(motionevent event) {
  mlister.ondragviewclick();
  return super.ontouchevent(event);
 }
 public void startscroll(final int start, int end, final boolean isleft){
  valueanimator valueanimator = valueanimator.offloat(start,end).setduration(800);
  valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener() {
   @override
   public void onanimationupdate(valueanimator animation) {
    if (isleft) {
     layoutparams.leftmargin = (int) (start*(1-animation.getanimatedfraction()));
    } else {
     layoutparams.leftmargin = (int) (start + (screenwidth - start - getwidth())*(animation.getanimatedfraction()));
    }
    setlayoutparams(layoutparams);
   }
  });
  valueanimator.start();
 }
 /**
  * 获取状态栏的高度
  * @return 状态栏高度
  */
 public int getstatusbarheight() {
  int result = 0;
  int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android");
  if (resourceid > 0) {
   result = getresources().getdimensionpixelsize(resourceid);
  }
  return result;
 }
}

以上所述是小编给大家介绍的android实现跟随手指拖动并自动贴边的view样式,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网