Android实现View的拖拽
程序员文章站
2022-07-01 23:46:31
本文实例为大家分享了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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: asp.net常用函数收藏第1/2页