How to Bring layout back to its original position in android after drag -


i have working on project. need drag layout, manage move (drag) layout when release touch not coming @ original position.

please tell me should in motionevent.action_up can layout original position.

following code.

import android.app.activity; import android.os.bundle; import android.util.log; import android.view.motionevent; import android.view.view; import android.view.view.ontouchlistener; import android.view.viewgroup; import android.widget.relativelayout;  public class homeactivity extends activity implements ontouchlistener {      relativelayout _view;     relativelayout _view1;     // textview _view;     viewgroup _root;     private int _xdelta;     relativelayout.layoutparams lparams;     relativelayout.layoutparams mainlparams;     private int _ydelta;      // private int x1, y1, width;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.main);          _root = (viewgroup) findviewbyid(r.id.root);          _view = (relativelayout) findviewbyid(r.id.relativelayout);            _view.setontouchlistener(this);         lparams = (relativelayout.layoutparams) _view.getlayoutparams();         mainlparams = (relativelayout.layoutparams) _view.getlayoutparams();         // _root.addview(_view1);      }      public boolean ontouch(view view, motionevent event) {         int x = (int) event.getrawx();         int y = (int) event.getrawy();          relativelayout.layoutparams layoutparams;         lparams = (relativelayout.layoutparams) view.getlayoutparams();          switch (event.getaction() & motionevent.action_mask) {         case motionevent.action_down:             log.e("", "inside action_down");             lparams = (relativelayout.layoutparams) view.getlayoutparams();             _xdelta = x - lparams.leftmargin;             _ydelta = y - lparams.topmargin;              break;         case motionevent.action_up:             log.e("", "inside action_up");             if ((x - _xdelta) < -150) {                 _root.removeview(_view);             } else {                 view.setlayoutparams(mainlparams);             }              break;         case motionevent.action_move:             log.e("", "inside action_move");              layoutparams = (relativelayout.layoutparams) view.getlayoutparams();             layoutparams.leftmargin = x - _xdelta;             layoutparams.topmargin = y - _ydelta;             layoutparams.rightmargin = -250;             layoutparams.bottommargin = -250;              view.setlayoutparams(layoutparams);             break;         }         _root.invalidate();         return true;     }  } 

new edit

here show simple (and way not clean code) how want do. have relativelayout green linearlayout inside:

    <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/relative_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" >  <linearlayout     android:id="@+id/moving_layout"     android:layout_width="100dp"     android:layout_height="100dp"     android:background="#00ff00"     android:gravity="center"     android:orientation="vertical" >      <textview         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hello_world" /> </linearlayout>      </relativelayout> 

then in mainactivity, set toplayout, view want move inside, ontouchlistener. set originalx , originaly @ action_down , movex , movey @ action_move. when user release fingers, go original position:

    public class mainactivity extends activity implements ontouchlistener {  private linearlayout mlinearlayout; private relativelayout mrelativelayout; private relativelayout.layoutparams params; private float originalx = 0; private float originaly = 0; private float movex = 0; private float movey = 0;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);      mlinearlayout = (linearlayout) findviewbyid(r.id.moving_layout);     mrelativelayout = (relativelayout) findviewbyid(r.id.relative_layout);     mrelativelayout.setontouchlistener(this);      int width = getmetrics(100);     int height = getmetrics(100);      params = new relativelayout.layoutparams(width, height);  }    /**  * converts dp px  *   * @param dp  * @return  */ private int getmetrics(int dp) {      displaymetrics displaymetrics = this.getresources().getdisplaymetrics();     return (int) ((dp * displaymetrics.density) + 0.5); }  public boolean ontouch(view v, motionevent event) {     // todo auto-generated method stub      switch (event.getaction()) {      case (motionevent.action_down):          originalx = event.getx(); //set x start position         originaly = event.gety();//set y start position         movex = event.getx();//first move x         movey = event.gety();//first move y         break;      case (motionevent.action_move):          movex = event.getx();//set move x         movey = event.gety();//set move y          //set layoutparams mlinearlayout         params.leftmargin = (int) movex;         params.topmargin = (int) movey;         mlinearlayout.setlayoutparams(params);          break;      case (motionevent.action_up):          //set mlinearlayout original position         params.leftmargin = (int) originalx;         params.topmargin = (int) originaly;         mlinearlayout.setlayoutparams(params);         break;      }     return true; }      } 

don´t wonder getmetrics() method, because setting same width , height mlinearlayout defined in xml. in xml, set values dp, @ layoutparams, px. not relevant question. doin here is, set original x , y @ action_down , @ action_up. so, everytime user press down again, these values "renewed", layout going last points of action_down if fingers release. should give idea how handle problem.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

qt - Errors in generated MOC files for QT5 from cmake -