8

私は2つの課題があるプロジェクトを持っています:

初め:

  • 指が画面に触れた場所にアイコンを移動します。

このため、私が見つけた最良のアプローチは.layout()、ビューでメソッドを使用することです。

2番:

  • RelativeLayoutに、画面の幅と高さの両方を持つ2つのレイアウトがあります(1つは他の背後に隠されています)。ボタンをクリックするたびに、いくつかのくぼみの上にあるものを右に移動したいと思います。

Android でビューを移動するより良い方法はありますか?

メソッドを使用することの欠点は何.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  

前もって感謝します。

4

5 に答える 5

8

LayoutParamsWindowManager は、それ自体のインスタンスに加えて、ビューごとに少なくとも 2 つのクラスのインスタンスを維持しViewます。

の確認updateViewLayout方法WindowManager、特にこの部分:

    view.setLayoutParams(wparams);

    synchronized (this) {
        int index = findViewLocked(view, true);
        ViewRoot root = mRoots[index];
        mParams[index] = wparams;
        root.setLayoutParams(wparams, false);
    }

直接電話することで混乱を招く可能性があると思いますlayoutWindowManager.updateViewLayout代わりに使用してください。遅くなりますが、安全です(IMOだけ)。


アップデート

[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);
于 2012-11-16T11:56:38.507 に答える
5

指でビューを移動する最も簡単な方法は、View クラスの setTranslationX と setTranslationY を使用することです。

http://developer.android.com/reference/android/view/View.html#setTranslationX(フロート)

API < 11 をターゲットにしている場合は、View LayoutParams のマージンを移動するように変更することもできます。

ビューには既にこれらのオプションがあり、ビューを手動で描画すると、アイテムや異なるビューを追加すると複雑になる可能性があるため、 onLayout または onDraw 関数でアイテムを移動すると悪化すると思います。

于 2012-11-23T16:58:21.850 に答える
1

オブジェクトアニメーションを使用できます

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

 }

}
于 2013-02-28T08:47:04.910 に答える
0

View メソッドを使用できますhttp://developer.android.com/reference/android/view/View.html#offsetTopAndBottom(int)

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

于 2015-07-09T09:59:53.480 に答える