如何以编程方式将按钮移动到屏幕中心?

时间:2015-03-20 16:38:24

标签: android centering overlap objectanimator

首先使用XML标记android:layout_centerHorizontal="true"创建Button,它可以正常工作。

但是这个Button在运行时使用ObjectAnimator沿x轴移动。

现在我想将Button移回到开头的位置,但我无法弄清楚如何做到这一点(我想保留动画!)。 Button永远不会沿y轴移动。

我试过了

Display display = getWindowManager().getDefaultDisplay();
        Point point = new Point();
        display.getSize(point);
        ObjectAnimator animator = ObjectAnimator.ofFloat(button, "X", (point.x/2)-(button.getWidth()/2));
        animator.start();

已经,但我的按钮每次都在某个方面有点太远了(~30px)。它似乎没有受到保证金的影响。填充影响了这一点。当我将填充设置为0dp时,偏移量会变小(~5px),但仍然存在。

希望你能够指出我的错误,知道一个解决方案,甚至知道一个更好的方法来移动视图。我以前编辑了transitionX值,可以将其重置为0。这种方法对我来说不再适用,因为我试图检查我的Button是否与另一个View重叠(它在较小的设备上执行但在较大的设备上没有)并对其作出反应。

谷歌搜索或浏览stackoverflow也无济于事......

提前致谢 Tafelbomber

修改

我发现button.getX()通过在移动按钮之前立即调用它并在将其移动到查询的X值之后给我错误的值。这与以前的效果相同。


编辑2:

上述问题在PC重启后解决了问题。但是我只解释了一点的另一个问题仍然存在:我想以编程方式检查两个视图是否重叠。在屏幕截图中,我为了方便而为微调器着色。要检查我是否尝试过这种方法:

private boolean viewsOverlap(View leftView, View rightView){
    float leftViewRight = leftView.getRight();
    float rightViewLeft = rightView.getLeft();
    System.out.println("leftViewRight "+leftViewRight);
    System.out.println("rightViewLeft "+rightViewLeft);
    System.out.println("viewsOverlap: " + (leftViewRight > rightViewLeft));
    return leftViewRight > rightViewLeft;
}

但输出并不像预期的那样:

System.out﹕ leftViewRight 718.0
System.out﹕ rightViewLeft 0.0
System.out﹕ viewsOverlap: true

Button和Spinner的屏幕截图:http://i.stack.imgur.com/G8DYP.jpg (对不起,但我不允许发布少于10个声望的图片)

leftView是Button,rightView是Spinner。两者都已经移动过,如第一个例子所示。你可以清楚地看到它们没有重叠,旋转器的左边缘也不是0.0,按钮的右边缘不是718而是约400。您甚至可以估计该值必须是错误的,因为屏幕是全高清。

1 个答案:

答案 0 :(得分:0)

有时在您使用translateX(dx)方法时重叠的视图 - 如果您执行getRight(),然后按差异翻译Button该怎么办?那样它应该总是与这个观点相符,这听起来像你想要的那样?

或者做类似的事情但是再次使用ObjectAnimator来反转动画?

考虑解决问题的另一种方法是重新应用布局参数:
xxx.LayoutParams lps = new xxx.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); lps.gravity = Gravity.CENTER_IN_HORIZONTAL; mButtonView.setLayoutParams(lps);

动画结束时