【问题标题】:How do I move a button into the screen's center programmatically?如何以编程方式将按钮移动到屏幕中心?
【发布时间】:2015-03-21 03:42:25
【问题描述】:

首先,Button 是使用 XML 标记 android:layout_centerHorizontal="true" 创建的,效果很好。

但是这个 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();

已经,但是我的 Button 每次都在右边有点太远了(~30px)。它似乎不受保证金的影响。填充会影响这一点。当我将填充设置为 0dp 时,偏移量要小得多(~5px)但仍然存在。

希望您能够指出我的错误,知道解决方案,甚至知道移动视图的更好方法。我曾经编辑过transitionX 值,它可以重置为0。该方法不再适用于我,因为我尝试检查我的 Button 是否与另一个 View 重叠(在较小的设备上会这样做,但在较大的设备上不会)并对其做出反应。

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

提前致谢 塔菲尔轰炸机

编辑:

我发现button.getX() 在将按钮移开之前立即调用它,然后将其移至查询的 X 值,从而给了我错误的值。这与之前的效果相同。


编辑 2:

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

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

按钮和微调器的屏幕截图:http://i.stack.imgur.com/G8DYP.jpg (对不起那个链接,但我不能发布低于 10 名声望的图片)

leftView 是按钮,rightView 是微调器。两者都已经移动,如第一个示例所示。正如您可以清楚地看到它们没有重叠,并且 Spinners 左边缘也不在 0.0 并且按钮的右边缘不在 718 而是在 ~400。你甚至可以估计这个值一定是错误的,因为屏幕是全高清的。

【问题讨论】:

    标签: android centering overlap objectanimator


    【解决方案1】:

    当你使用translateX(dx)方法时,它有时会重叠的视图——如果你打开getRight(),然后通过差异翻译Button怎么办?这样一来,它应该始终与那个观点相抵触,这听起来像你想要的吗?

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

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

    动画结束时。

    【讨论】:

    • 您提到的第一件事在我的情况下不起作用,但无论如何这是另一个问题。我只是解释说翻译不可能解决我的问题。关于重新应用布局参数的部分听起来是个好主意,但我不知道如何为它制作动画……这可能吗?
    • 你不能只保存第一次动画的距离,然后反转吗?无法为setLayoutParams 设置动画,但是您可以找到屏幕(或窗口或视图)的水平中心,然后进行动画转换。一些屏幕截图可能有助于解释您的问题发生了什么!
    • 我想我必须原谅我。重新启动我的 PC 并重新启动 AndroidStudio 后,我的问题消失了,一切正常。不过,您的建议仍然是正确且有帮助的!我的第二个问题,我只解释了一点,仍然存在并且没有改变。我会按照您的建议更新我的问题并上传屏幕截图。
    • getLeft()getRight() 相对于父视图。这两个 vie 都是同一个视图组的孩子吗?
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2021-01-21
    • 2023-01-12
    相关资源
    最近更新 更多