How to move a view in Android?

試著忘記壹切 提交于 2019-12-18 13:28:58

问题


I have a project where I have 2 challenges:

First:

  • Move an icon to wherever the finger touches the screen:

For this, the best approach I've found, is to use .layout() method on the view.

Second:

  • I have two layouts, on a RelativeLayout, both with screen width and height (1 is hidden behind the other). I want to move the one above a few dips to the right every time I click a button.

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.


回答1:


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);



回答2:


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.




回答3:


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();

 }

}



回答4:


You can use View method http://developer.android.com/reference/android/view/View.html#offsetTopAndBottom(int)

or http://developer.android.com/reference/android/view/View.html#offsetLeftAndRight(int)




回答5:


you can move a view with animation use ObjectAnimatior class. like below

ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY or translationX" , number in Float)
animator.setDuration(miliseconds).start();

and the view will go wherever you decide



来源:https://stackoverflow.com/questions/13415306/how-to-move-a-view-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!