草庐IT

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

coder 2023-12-23 原文

有一个带有膨胀行的 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 - ListView 中膨胀行中某些布局的动画的更多相关文章

  1. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  2. ruby - nanoc 和多种布局 - 2

    是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

  3. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  6. ruby-on-rails - 在事件记录库中添加某些方法的首选方法是什么? - 2

    我想创建一个模块,为从事件记录库继承的类提供一些通用方法。以下是我们可以实现的两种方式。1)moduleCommentabledefself.extended(base)base.class_evaldoincludeInstanceMethodsextendClassMethodsendendmoduleClassMethodsdeftest_commentable_classmethodputs'testclassmethod'endendmoduleInstanceMethodsdeftest_commentable_instance_methodputs'testinstanc

  7. ruby-on-rails - 第 1 行中的引号缺失或遗漏 (CSV::MalformedCSVError) - 2

    我在ruby​​/rails中导入此CSV文件时遇到问题我得到的错误信息是这样的:Missingorstrayquoteinline1(CSV::MalformedCSVError)但我不确定发生了什么,因为我的CSV看起来非常好。以下是示例数据:"lesley_grades","lesley_id","last","first","active","site","cohort","section","sections_title","faculty","completed_term_cred","term","sec_start_date","sec_end_date","grade

  8. LVGL V8动画 - 2

    动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim

  9. ruby - 生成X和Y之间的随机数,不包括某些数字 - 2

    有没有办法在ruby​​中生成介于1-100但不包括20、30和40之间的随机数?我可以做类似的事情defrandom_numberrandom_number=rand(100)whilerandom_number==20||30||40random_number=rand(100)endreturnrandom_numberend...但这似乎不是很有效(再加上那个特定的例子可能根本行不通)。有没有更简单的方法?任何帮助深表感谢! 最佳答案 创建一个1到100的数组。从该数组中删除不需要的元素。然后从数组中选择一个随机数。([*1

  10. ruby-on-rails - 仅在某些页面上使用 rails_xss - 2

    我正在使用rails_xss运行Rails2.3.14插入。我有另一个用于创建管理仪表板View的插件。我的问题是rails_xss正在转义我的仪表板插件生成的所有HTML。有没有一种方法可以将rails_xss配置为不转义匹配example.com/admin或基于目录(app/views/admin)或任何类似的页面结果一样吗? 最佳答案 更新仪表板生成插件以使用raw或html_safe进行内容输出可能会更简单。 关于ruby-on-rails-仅在某些页面上使用rails_xss

随机推荐