android - ListView 中膨胀行中某些布局的动画

标签 android listview animation

有一个带有膨胀行的 ListView 。在每一行,都有一个名为 btn_to_show_actual 的按钮,用于从屏幕右侧外部向屏幕(在其父行的相同 Y 位置)。

 X_in_screen = Constants.SCREEN_W * 1/2 ; 
 X_out_screen = Constants.SCREEN_W 
 Y_in_screen = Constants.SCREEN_H /2;

以上内容均经过正确的数字检查。

代码如下:

ListView 中每个膨胀行的布局:

<ImageButton
    android:id="@+id/btn_to_show_actual"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@null"
    android:src="@drawable/btn_to_show_actual_selector"
    android:scaleType="fitXY"/>

<RelativeLayout
    android:id="@+id/ll_hide_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/btn_to_show_actual"
    android:layout_alignBottom="@+id/btn_to_show_actual"
    android:layout_toLeftOf="@+id/btn_to_show_actual"
    android:orientation="horizontal">

    <ImageButton
        android:id="@+id/btn_to_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn_delete"
        android:background="@null"
        android:src="@drawable/btn_left_selector"
        android:scaleType="fitXY"/>

    <ImageButton
        android:id="@+id/btn_to_hide"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn_delete"
        android:background="@null"
        android:src="@drawable/btn_right_selector"
        android:scaleType="fitXY"/>

    <ImageButton
        android:id="@+id/btn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn_amend"
        android:background="@null"
        android:src="@drawable/btn_delete_selector"
        android:scaleType="fitXY"/>

    <ImageButton
        android:id="@+id/btn_amend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/btn_share"
        android:background="@null"
        android:src="@drawable/btn_input_selector"
        android:scaleType="fitXY"/>

    <ImageButton
        android:id="@+id/btn_share"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@null"
        android:src="@drawable/btn_share2_selector"
        android:scaleType="fitXY"/>


</RelativeLayout>

代码:

btn_to_show_actual.setOnClickListener(new View.OnClickListener()
                {
                    public void onClick(View v) {
                        Utilities.system_toast(Show_database.this, "btn to show actual pressed" + "\n" + "X-screen=" + Constants.SCREEN_W + "; X-in=" + X_in_screen + "; X-out= " + X_out_screen + "; Y=" + Y_in_screen);

                        //btn_to_show_actual.setVisibility(View.INVISIBLE);
                        btn_to_show.setVisibility(View.VISIBLE);

                        translate_to_left =  new TranslateAnimation(Animation.ABSOLUTE, X_out_screen,                   // from X0
                                Animation.ABSOLUTE, X_in_screen,        // to X1
                                Animation.ABSOLUTE, Y_in_screen,        // from Y0
                                Animation.ABSOLUTE, Y_in_screen);       // to Y1
                        translate_to_left.setInterpolator(new DecelerateInterpolator());
                        translate_to_left.setDuration(800);
                        translate_to_left.setFillAfter(true);
                        translate_to_left.setAnimationListener(new Animation.AnimationListener() {
                            public void onAnimationStart(Animation a) {
                            }
                            public void onAnimationRepeat(Animation a) {}
                            public void onAnimationEnd(Animation a)
                            {
                                btn_to_hide.setVisibility(View.VISIBLE);
                                btn_to_show.setVisibility(View.INVISIBLE);
                            }
                        });

                        ll_hide_btn.startAnimation(translate_to_left);
                    }
                });

                btn_to_hide.setOnClickListener(new View.OnClickListener()
                {
                    public void onClick(View v)
                    {
                        Utilities.system_toast(Show_database.this, "btn to hide pressed");

                        translate_to_right =  new TranslateAnimation(Animation.ABSOLUTE, X_in_screen,               // from X0
                                Animation.ABSOLUTE, X_out_screen,           // to X1
                                Animation.ABSOLUTE, Y_in_screen,            // from Y0
                                Animation.ABSOLUTE, Y_in_screen);           // to Y1
                        translate_to_right.setInterpolator(new DecelerateInterpolator());
                        translate_to_right.setDuration(800);
                        translate_to_right.setFillAfter(true);
                        translate_to_right.setAnimationListener(new Animation.AnimationListener() {
                            public void onAnimationStart(Animation a) {
                            }
                            public void onAnimationRepeat(Animation a) {}
                            public void onAnimationEnd(Animation a)
                            {
                                btn_to_hide.setVisibility(View.INVISIBLE);
                                btn_to_show.setVisibility(View.VISIBLE);
                                btn_to_show_actual.setVisibility(View.VISIBLE);
                            }
                        });

                        ll_hide_btn.startAnimation(translate_to_right);
                    }
                });

问题:

按下 btn_to_show_actual 后,ll_hide_btn 无法从屏幕外转换为屏幕。我怎样才能使 ll_hide_btn 显示/消失并正确翻译?

最佳答案

我建议使用 Animator 而不是 Animation,因为它只会改变对象的视觉表示。因此,您可能会遇到使用动画的按钮触摸坐标问题

另一方面,动画师会改变对象的物理属性。因此,如果将 View 移动到新位置,触摸坐标将映射到新位置。

要获得您想要的行为,您不需要平移 Y 轴,只需平移 X 轴。可以在X_out_screen 位置设置ll_hide_btn 的初始TranslationX 来设置ll_hide_btn offscreen,然后动画为0 如果你想将按钮平移到屏幕上

你的实现可能是这样的:

在 X_out_screen 位置设置 ll_hide_btn translationX:

ll_hide_btn.setTranslationX(X_out_screen)

点击监听器:

btn_to_show_actual.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        btn_to_show.setVisibility(View.VISIBLE);

        ll_hide_btn.animate()
                .translationX(0f)
                .setDuration(800)
                .setInterpolator(new DecelerateInterpolator())
                .setListener(new Animator.AnimatorListener() {

                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        btn_to_hide.setVisibility(View.VISIBLE);
                        btn_to_show.setVisibility(View.INVISIBLE);
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });
    }
});

btn_to_hide.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        ll_hide_btn.animate()
                .translationX(X_out_screen.toFloat())
                .setDuration(800)
                .setInterpolator(new DecelerateInterpolator())
                .setListener(new Animator.AnimatorListener() {

                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        btn_to_hide.setVisibility(View.INVISIBLE);
                        btn_to_show.setVisibility(View.VISIBLE);
                        btn_to_show_actual.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });
    }
});

关于android - ListView 中膨胀行中某些布局的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54505302/

相关文章:

android - 'android.content.Context.deleteDatabase()'的定义在哪里

android - Ionic cordova 构建 android 失败 - 由于某些路径错误

android - Android EditText中的垂直内容对齐

java - 可运行的 ListViewAdapter 导致 "cannot be cast to android.content.Context"错误

java - 长按在 ListView 行上不起作用

ios - 动画图标变化

java - 如何使用listview.GetItemAtPosition(e.Position)获取用户点击的ListView项的数据?

android - ListView onItemclickListener 不工作

c# - 在不同的触摸上运行不同的动画

image - 将 gif 图像与 png 图像合并