如何正确移动视图?

时间:2012-04-13 12:55:13

标签: android animation view position

有人可以向菜鸟解释动画视图的正确方法,使其触控区域和图像实际上一起移动吗?!

我已经阅读了很多帖子和问题以及教程,但没有一个解释了什么会移动布局以及图像的移动方式,以便我可以为视图设置动画,然后将其保留在新位置。

这是我正在使用的示例方法,尝试了许多不同的组合而没有成功。该视图位于父RelativeLayout中。这是一个可触摸的图标菜单,并通过点击一个xml资源动画显示屏幕滑动,只留下一个小标签显示,它需要保留,直到再次点击。

public void RetractTools (View v){      
    final ImageView finalImage1 = (ImageView) findViewById(R.id.paintsView);
    Animation slideout = AnimationUtils.loadAnimation(this, R.anim.slideout_tools);
    slideout.setFillAfter(true);
    slideout.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationEnd(Animation animation) {
            finalImage1.setEnabled(true);
            optionMenu.showing = false;
            optionMenu.inMotion = false;
            finalImage1.layout(1258, 668, 1697, 752);
            finalImage1.setRight(1280);
            finalImage1.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
        }

        @Override
        public void onAnimationStart(Animation arg0) {
            finalImage1.setEnabled(false);
        }
    });

    optionMenu.inMotion = true;
    v.startAnimation(slideout);
 }// End RetractMenu

无论我尝试什么,我都会遇到问题。 setFillAfter在xml文件中设置时不执行任何操作。以编程方式设置,它将图像保留在正确的位置,但触摸控件保留在菜单所在的位置。我已经尝试过setLeft和setRight,它们显然只移动图像,而不是视图位置,以及各种不同的布局选项,填充和无填充和无效而不是,但无法解决它。我显然不会理解定位和渲染视图所需的基础机制! :d

感谢。

编辑:解决方案

对于有类似问题的人来说,这就是我发现使用相对布局的方法。您创建具有指定大小的LayoutParams对象,然后您可以为其分配位置。例如。

    final RelativeLayout.LayoutParams position = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);           
    position.leftMargin = 440;

然后将其分配给您的视图

    myView.setLayoutParams(position);

总而言之,您使用LayoutParams对象作为视图位置的接口,而不是像我假设的那样直接访问视图的坐标。

1 个答案:

答案 0 :(得分:2)

你所拥有的基本上是好的,有两个缺陷:

  1. 您正在使用setFillAfter(),这不是特别有用

  2. 您正在调用layout()setRight()以及其他不太有效的内容

  3. 相反,在onAnimationEnd()中,您需要修改LayoutParams的{​​{1}}以反映您希望窗口小部件所处的新位置。窗口小部件的大小和位置是由它与容器协商的布局规则决定。最初,这些是通过布局XML资源设置的。通过在运行时修改View,您将更改这些规则。

    那些LayoutParams是什么(LayoutParamsLinearLayout.LayoutParams等)以及你应该在其中指定的值,我们无法告诉你,因为我们不知道你是什么做。