如何从右到左为LAYOUT设置动画?

时间:2017-10-24 07:17:40

标签: android android-layout android-animation

如果您想了解更多背景信息,请参阅我的this previous question

我想要一个滑入式菜单,菜单本身就是一个网格视图,包含多个图像和文本视图。

这就是我所做的:使用constaint布局,我把它放在屏幕右边缘之外,以为我所要做的就是将它从外部移动到屏幕内部。

我遇到了很多问题但是我解决了大部分问题。现在我有一个问题无法解决:

您会看到,当您为“视图”设置动画时,编程反应区域(例如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>

正如您所看到的,我正在将图像,我的布局/视图的图形表示/移动到我的布局/视图/反应区域的-100%。那么如果我使用它会发生什么:

constraintLayoutParams.leftMargin = 1958; 
swipeGridMenu.setLayoutParams(constraintLayoutParams);

?用户将看到屏幕右侧出现的菜单,但无论如何都不会接近屏幕的右边缘,而是在菜单之间有一个空白区域(由于反应区域不是,因此无法点击)正确对齐它,它留在后面)和屏幕的右边缘,空白区域的宽度是菜单的宽度,因为这是反应区域/布局的位置。下图说明了情况:

enter image description here

我放弃了。无论我如何调整它,它总会最终出现令人讨厌且不太理想的东西。那么我如何设置动画并移动整个布局?我只想平滑地将我的gridview菜单移动到新位置,并使其保持在那里,并使其可点击。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以在ConstraintLayout中使用CoordinatorLayout作为菜单的容器,并使用TransitionManager为布局设置动画。我使用这种方法从屏幕底部淡入和淡出ListView。列表视图始终可用,但可见性设置为View.GONE。要淡入视图,您可以执行以下操作:

TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.VISIBLE);

对于淡出,你只需要这样做:

TransitionManager.beginDelayedTransition(layoutContainer);
listView.setVisibility(View.GONE);

答案 1 :(得分:1)

这很好用:

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>