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
Post a Comment