I have a project where I have 2 challenges:
First:
For this, the best approach I've found, is to use .layout()
method on the view.
Second:
Is there a better way to move views on Android?
What could be the disadvantages of using the method .layout()
?
public void layout (int l, int t, int r, int b)
Since: API Level 1
Assign a size and position to a view and all of its descendants
Parameters:
l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent
Thanks in advance.
To make the view draggable we should ensure that it will not impact/disturb other views on the page/layout. To achieve that we can make use of FrameLayout. FrameLayout is a ViewGroup where if you add a child view to it, the child view will be positioned to the top left corner of the screen.
WindowManager maintains at least two more instances of LayoutParams
class for each view, besides that one in the View
itself.
Check updateViewLayout
method of WindowManager
, this part in particular:
view.setLayoutParams(wparams);
synchronized (this) {
int index = findViewLocked(view, true);
ViewRoot root = mRoots[index];
mParams[index] = wparams;
root.setLayoutParams(wparams, false);
}
I believe that you can make some mess by calling layout
directly. Use WindowManager.updateViewLayout
instead. It will be slower, but safe (just IMO).
UPDATE
[From: https://stackoverflow.com/a/11188273/327011 ]
WindowManager windowsManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)
WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();
windowParams.x = <new X coord>;
windowParams.y = <new Y coord>
windowParams.height = myImageView.getHeight();
windowParams.width = myImageView.getWidth();
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
windowManager.updateViewLayout(myImageView, windowParams);
The easiest way to move a view with the finger is using the setTranslationX and setTranslationY from the View class.
http://developer.android.com/reference/android/view/View.html#setTranslationX(float)
You can also change the margins on the View LayoutParams to move if you are targeting api < 11.
I believe that moving the item on the onLayout or onDraw function worse because the view already has these options above and drawing your view manually can become complex as you add more items and different views.
You could use object animation
/**
* The java class is used to move the widgets to the region of the touch point from its original position
*
* @author gfernandes
*
*/
public class animate {
/**
* Variable declaration
*
*/
private ObjectAnimator animation1;
private ObjectAnimator animation2;
/**
* Function animate: Animates the widget Eg:Button from its position to the
* position of the touch point.
*
* @param[in] -The coordinates of the touch point (x, y)
* -The coordinates of the widget position (valx, valy)
* -The widget object id
*
*/
public void animategroup1(int x, int y, Object val, int valx, int valy ){
System.out.println("animategroup1 entered here");
System.out.println("x:"+x);
System.out.println("y"+y);
System.out.println("valx"+valx);
System.out.println("valy"+valy);
animation1 = ObjectAnimator.ofFloat(val, "x", valx, x);
animation2 = ObjectAnimator.ofFloat(val, "y", valy, y);
AnimatorSet set = new AnimatorSet();
set.playTogether(animation1, animation2);
set.start();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With