Drag an an initially centered TextView around RelativeLayout in Android -
so i'm messing around interacting touch events/gestures in android. 1 of first things did make textview in relativelayout can drag around.
java code is:
public class draggystuff extends actionbaractivity implements view.ontouchlistener { private textview mtextview; private viewgroup mrootlayout; private int _xdelta; private int _ydelta; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_draggystuff); mrootlayout = (viewgroup) findviewbyid(r.id.root); mtextview = (textview) mrootlayout.findviewbyid(r.id.textview); relativelayout.layoutparams layoutparams = (relativelayout.layoutparams) mtextview.getlayoutparams(); mtextview.setontouchlistener(this); } @override public boolean ontouch(view v, motionevent event) { final int x = (int) event.getrawx(); final int y = (int) event.getrawy(); switch (event.getaction() & motionevent.action_mask) { case motionevent.action_down: relativelayout.layoutparams lparams = (relativelayout.layoutparams) mtextview.getlayoutparams(); _xdelta = x - lparams.leftmargin; _ydelta = y - lparams.topmargin; log.d("x is", string.valueof(_xdelta)); log.d("y is", string.valueof(_ydelta)); break; case motionevent.action_up: break; case motionevent.action_pointer_down: break; case motionevent.action_pointer_up: break; case motionevent.action_move: relativelayout.layoutparams layoutparams = (relativelayout.layoutparams) mtextview .getlayoutparams(); layoutparams.leftmargin = x - _xdelta; layoutparams.topmargin = y - _ydelta; layoutparams.rightmargin = -250; layoutparams.bottommargin = -250; mtextview.setlayoutparams(layoutparams); break; } mrootlayout.invalidate(); return true; } }
this works fine. sets textview in upper left corner, , can drag around screen. when stop dragging, stays put left it.
next decided should start textview in center of screen. this, modified oncreate method follows:
protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_draggystuff); mrootlayout = (viewgroup) findviewbyid(r.id.root); mtextview = (textview) mrootlayout.findviewbyid(r.id.textview); relativelayout.layoutparams layoutparams = (relativelayout.layoutparams) mtextview.getlayoutparams(); layoutparams.addrule(relativelayout.center_in_parent, relativelayout.true); mtextview.setontouchlistener(this); }
this accomplished goal of centering textview, not move when dragged it. figured might because centering attribute locking in place. thought if removed centering attribute before changed coordinates, might work. added line ontouch method follows:
public boolean ontouch(view v, motionevent event) { final int x = (int) event.getrawx(); final int y = (int) event.getrawy(); switch (event.getaction() & motionevent.action_mask) { case motionevent.action_down: relativelayout.layoutparams lparams = (relativelayout.layoutparams) mtextview.getlayoutparams(); _xdelta = x - lparams.leftmargin; _ydelta = y - lparams.topmargin; log.d("x is", string.valueof(_xdelta)); log.d("y is", string.valueof(_ydelta)); break; case motionevent.action_up: break; case motionevent.action_pointer_down: break; case motionevent.action_pointer_up: break; case motionevent.action_move: relativelayout.layoutparams layoutparams = (relativelayout.layoutparams) mtextview .getlayoutparams(); layoutparams.addrule(relativelayout.center_in_parent, 0); layoutparams.leftmargin = x - _xdelta; layoutparams.topmargin = y - _ydelta; layoutparams.rightmargin = -250; layoutparams.bottommargin = -250; mtextview.setlayoutparams(layoutparams); break; } mrootlayout.invalidate(); return true; }
now however, textview starts out in middle of screen, drag begins, instantly moves upper left before following relative movements of finger!
how can center textview in relativelayout in such way neither locks in place nor moves corner before dragging?
instead of using relative layout, try linear layout , use setgravity(gravity.center) on textview see whether indeed addrule method causes textview ignore touch events.
also, have tried applying layout params using xml, , seeing whether problem reproduced on there?
last, textview move upper-left on down action event or move action event?
Comments
Post a Comment