我有一个项目,我有2个挑战:
第一:
对于这一点,我已经找到了最好的方法,就是用.layout()
方法的视图。
第二:
- 我有两个布局,在RelativeLayout的 ,都与屏幕宽度和高度(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
提前致谢。
窗口管理器保持至少两个实例LayoutParams
类每个视图,除了一个在View
本身。
检查updateViewLayout
的方法WindowManager
,这部分特别是:
view.setLayoutParams(wparams);
synchronized (this) {
int index = findViewLocked(view, true);
ViewRoot root = mRoots[index];
mParams[index] = wparams;
root.setLayoutParams(wparams, false);
}
我相信,你可以通过调用作一些乱七八糟的layout
直接。 使用WindowManager.updateViewLayout
代替。 它会慢一些,但是安全(只是IMO)。
UPDATE
[来自: 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);
移动用手指景色最简单的方法是使用setTranslationX和setTranslationY从视图类。
http://developer.android.com/reference/android/view/View.html#setTranslationX(float )
您也可以改变视图的LayoutParams边缘,如果你的目标API <11移动。
我相信,移动项目上onLayout或OnDraw函数更糟,因为视图已经具有高于和绘图视图当您添加更多的项目和不同的观点可以手动变得复杂这些选项。
你可以使用对象动画
/**
* 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();
}
}
您可以使用View方法http://developer.android.com/reference/android/view/View.html#offsetTopAndBottom(int)
或http://developer.android.com/reference/android/view/View.html#offsetLeftAndRight(int)