2

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

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

这是我正在使用的示例方法,尝试了许多不同的组合都没有成功。该视图位于父级 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 对象作为视图位置的接口,而不是像我假设的那样直接访问视图的坐标。

4

1 回答 1

2

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

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

  2. 你在打电话layout()等等setRight(),这不是特别有效

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

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

于 2012-04-13T13:01:54.383 回答