如何从右到左为 LAYOUT 设置动画?
How to animate a LAYOUT from right to left?
如果您想了解更多背景信息,请参阅我的 this previous question。
我想要一个滑入式菜单,菜单本身是一个网格视图,包含几个图像和文本视图。
我是这样做的:使用 containt 布局,我把它放在屏幕右边缘的外面,以为我所要做的就是将它从屏幕外移动到屏幕内。
我遇到了很多问题,但我还是解决了大部分问题。现在我有一个无法解决的问题:
您会看到,当您为 "view" 设置动画时,编程反应区域(例如 onTouchListener 响应的区域)将不会移动。换句话说,视图的图形表示、图像将被移动,但编程内容或布局可能(我不确定布局是否是我指的正确的东西,抱歉)将被保留在后面。
所以现在你可以理解我的困惑了。我想将图形和反应区域都移动到我的目标位置。换句话说,用户不仅应该能够看到从屏幕右边缘进入的菜单,他们应该能够点击它并且它应该是响应式的。
但我遇到的问题是用户将能够看到该视图,但如果他们在上面点击,则什么也不会发生 - 因为反应区域、布局(再次不确定它是否正确,抱歉)被落在了屏幕外。
我知道你在想什么:“所以只需使用
设置布局的新位置
setLayoutParams
?没那么难?
好吧,事情是这样的,在了解了所有背景之后,我终于要进入正题了,这是我必须做的事情,否则整个问题会显得很突兀。
翻译动画xml脚本如下:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:fillAfter="true">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="300"
/>
</set>
如您所见,我正在将 layout/view/whatever 的图像、图形表示移动到 layout/view/reactive 区域的 -100%。那么如果我使用这个会发生什么:
constraintLayoutParams.leftMargin = 1958;
swipeGridMenu.setLayoutParams(constraintLayoutParams);
?用户将看到一个菜单出现在屏幕的右侧,但无论如何都不会与屏幕的右边缘接壤,相反,菜单之间有一个空白 space(不可点击,因为反应区域没有正确对齐,它被留在后面)和屏幕的右边缘,空白区域的宽度是菜单的宽度,因为那是反应 area/layout 所在的位置。下图演示了情况:
我要放弃了。无论我如何调整它,它总是会以令人讨厌和不理想的方式结束。那么如何为整个布局设置动画和移动呢?我只是想顺利地将我的 gridview 菜单移动到新位置,并让它留在那里,并使其可点击。
任何帮助将不胜感激!
您可以使用 ConstraintLayout
作为 CoordinatorLayout
中菜单的容器,并使用 TransitionManager
为布局设置动画。我使用这种方法从屏幕底部淡入和淡出 ListView
。列表视图始终可用,但可见性设置为 View.GONE
。要淡入视图,您可以执行以下操作:
TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.VISIBLE);
要淡出,您只需要做:
TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.GONE);
这工作正常:
public class AnimationActivity extends AppCompatActivity {
int i = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.abc);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "clicked : #"+i++, Toast.LENGTH_SHORT).show();
}
});
imageView.setTranslationY(2000);
imageView.animate().translationY(0)
.setInterpolator(new FastOutLinearInInterpolator())
.setDuration(10000)
.start();
}
}
R.layout.abc
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
app:srcCompat="@drawable/ic_boy"
android:layout_gravity="center_horizontal"
android:layout_width="100dp"
android:layout_height="100dp" />
</FrameLayout>
如果您想了解更多背景信息,请参阅我的 this previous question。
我想要一个滑入式菜单,菜单本身是一个网格视图,包含几个图像和文本视图。
我是这样做的:使用 containt 布局,我把它放在屏幕右边缘的外面,以为我所要做的就是将它从屏幕外移动到屏幕内。
我遇到了很多问题,但我还是解决了大部分问题。现在我有一个无法解决的问题:
您会看到,当您为 "view" 设置动画时,编程反应区域(例如 onTouchListener 响应的区域)将不会移动。换句话说,视图的图形表示、图像将被移动,但编程内容或布局可能(我不确定布局是否是我指的正确的东西,抱歉)将被保留在后面。
所以现在你可以理解我的困惑了。我想将图形和反应区域都移动到我的目标位置。换句话说,用户不仅应该能够看到从屏幕右边缘进入的菜单,他们应该能够点击它并且它应该是响应式的。
但我遇到的问题是用户将能够看到该视图,但如果他们在上面点击,则什么也不会发生 - 因为反应区域、布局(再次不确定它是否正确,抱歉)被落在了屏幕外。
我知道你在想什么:“所以只需使用
设置布局的新位置setLayoutParams
?没那么难?
好吧,事情是这样的,在了解了所有背景之后,我终于要进入正题了,这是我必须做的事情,否则整个问题会显得很突兀。
翻译动画xml脚本如下:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:fillAfter="true">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="300"
/>
</set>
如您所见,我正在将 layout/view/whatever 的图像、图形表示移动到 layout/view/reactive 区域的 -100%。那么如果我使用这个会发生什么:
constraintLayoutParams.leftMargin = 1958;
swipeGridMenu.setLayoutParams(constraintLayoutParams);
?用户将看到一个菜单出现在屏幕的右侧,但无论如何都不会与屏幕的右边缘接壤,相反,菜单之间有一个空白 space(不可点击,因为反应区域没有正确对齐,它被留在后面)和屏幕的右边缘,空白区域的宽度是菜单的宽度,因为那是反应 area/layout 所在的位置。下图演示了情况:
我要放弃了。无论我如何调整它,它总是会以令人讨厌和不理想的方式结束。那么如何为整个布局设置动画和移动呢?我只是想顺利地将我的 gridview 菜单移动到新位置,并让它留在那里,并使其可点击。
任何帮助将不胜感激!
您可以使用 ConstraintLayout
作为 CoordinatorLayout
中菜单的容器,并使用 TransitionManager
为布局设置动画。我使用这种方法从屏幕底部淡入和淡出 ListView
。列表视图始终可用,但可见性设置为 View.GONE
。要淡入视图,您可以执行以下操作:
TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.VISIBLE);
要淡出,您只需要做:
TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.GONE);
这工作正常:
public class AnimationActivity extends AppCompatActivity {
int i = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.abc);
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "clicked : #"+i++, Toast.LENGTH_SHORT).show();
}
});
imageView.setTranslationY(2000);
imageView.animate().translationY(0)
.setInterpolator(new FastOutLinearInInterpolator())
.setDuration(10000)
.start();
}
}
R.layout.abc
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
app:srcCompat="@drawable/ic_boy"
android:layout_gravity="center_horizontal"
android:layout_width="100dp"
android:layout_height="100dp" />
</FrameLayout>