有人可以向菜鸟解释动画视图的正确方法,使其触控区域和图像实际上一起移动吗?!
我已经阅读了很多帖子和问题以及教程,但没有一个解释了什么会移动布局以及图像的移动方式,以便我可以为视图设置动画,然后将其保留在新位置。
这是我正在使用的示例方法,尝试了许多不同的组合而没有成功。该视图位于父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对象作为视图位置的接口,而不是像我假设的那样直接访问视图的坐标。
答案 0 :(得分:2)
你所拥有的基本上是好的,有两个缺陷:
您正在使用setFillAfter()
,这不是特别有用
您正在调用layout()
和setRight()
以及其他不太有效的内容
相反,在onAnimationEnd()
中,您需要修改LayoutParams
的{{1}}以反映您希望窗口小部件所处的新位置。窗口小部件的大小和位置是由它与容器协商的布局规则决定。最初,这些是通过布局XML资源设置的。通过在运行时修改View
,您将更改这些规则。
那些LayoutParams
是什么(LayoutParams
,LinearLayout.LayoutParams
等)以及你应该在其中指定的值,我们无法告诉你,因为我们不知道你是什么做。