欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android实现View的拖拽

程序员文章站 2022-03-28 16:29:46
本文实例为大家分享了android实现view拖拽的具体代码,供大家参考,具体内容如下前言实现view的拖拽,其实原理很简单。无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置...

本文实例为大家分享了android实现view拖拽的具体代码,供大家参考,具体内容如下

前言

实现view的拖拽,其实原理很简单。无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置。

首先是获取手机的位移信息就可以根据需求不同分为两种

  • 拖拽view本身,view实现移动。则设置view的setontouchlistener。
  • 在activity中随意滑动,view都会反应出动作。则重写activity ontouchevent方法。

而移动的方法嘛,也有几种

  • 给view设置补间动画,动画时间为0.(不推荐,因为移动的只是view的影子,本地还在原地)
  • 更改view 的margin。(不推荐,会影响viewgroup的布局排布)
  • 根据属性动画原理,更改settranslationx和settranslationy.(推荐此方法,不会影响原理的布局排布)

代码

public class viewtestactivity extends appcompatactivity {
  private static final string tag = "viewtestactivity";
  private textview mtv1,mtv2;
  private double lastx,lasty;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_view_test);
    mtv1= (textview) findviewbyid(r.id.tv01);
    mtv1.setontouchlistener(new view.ontouchlistener() {
      @override
      public boolean ontouch(view v, motionevent event) {
        double x=event.getrawx();
        double y=event.getrawy();
        log.d(tag, "ontouch: "+event.getaction());
        if (event.getaction()==motionevent.action_down){
          lastx=x;
          lasty=y;
        }else if (event.getaction()==motionevent.action_move){
          double dx=x-lastx;
          double dy=y-lasty;
          log.d(tag, "ontouch: dx=="+dx+",dy=="+dy);
//      startanimation(dx,dy);

          // movemethod1(dx, dy);
          movemethod2(dx, dy);

          lastx=x;
          lasty=y;
        }
        return true;
      }
    });
  }

//  @override
//  public boolean ontouchevent(motionevent event) {
//    double x=event.getrawx();
//    double y=event.getrawy();
//    log.d(tag, "ontouch: "+event.getaction());
//    if (event.getaction()==motionevent.action_down){
//      lastx=x;
//      lasty=y;
//    }else if (event.getaction()==motionevent.action_move){
//      double dx=x-lastx;
//      double dy=y-lasty;
//      log.d(tag, "ontouch: dx=="+dx+",dy=="+dy);
////      startanimation(dx,dy);
//
//     // movemethod1(dx, dy);
//      movemethod2(dx, dy);
//
//      lastx=x;
//      lasty=y;
//    }
//    return true;
//  }

  //根据属性动画的原理
  private void movemethod2(double dx, double dy) {
    
    mtv1.settranslationx((float) (mtv1.gettranslationx()+dx));
    mtv1.settranslationy((float) (mtv1.gettranslationy()+dy));
  }
  
  //根据margin 原理
  private void movemethod1(double dx, double dy) {
    viewgroup.marginlayoutparams marginlayoutparams= (viewgroup.marginlayoutparams) mtv1.getlayoutparams();
    marginlayoutparams.leftmargin+=dx;
    marginlayoutparams.topmargin+=dy;
    mtv1.setlayoutparams(marginlayoutparams);
  }

  private void startanimation(double dx, double dy) {
    objectanimator objectanimator=objectanimator.offloat(mtv1,"translationx", (float) (mtv1.gettranslationx()+dx)).setduration(3000);
    objectanimator.start();

    objectanimator objectanimator2=objectanimator.offloat(mtv1,"translationy", (float) (mtv1.gettranslationy()+dy)).setduration(3000);
    objectanimator2.start();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。