使用动画调整大小

2024-04-19

我用过android:windowSoftInputMode="调整调整大小"在清单中防止键盘隐藏活动按钮。它可以工作,但是当键盘打开时,我的按钮会向上移动。这有点紧张,我想知道 - 我可以有任何动画让它顺利过渡吗?

<activity
        android:name=".Activity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">
</activity>

方法setSoftInputMode(int)不能被覆盖,它的实现在内部Window类,我认为不可能用您自己的窗口替换当前窗口。您无法从以下位置进行管理:WindowManager too.
您可以在ViewGroup并捕获修改的布局SoftKeyboard正在打开和关闭。事实上,当 SKB 出现时,容器的布局会重新绘制并更改其高度。通过此事件,您可以设法设置Animation对视图子做出平滑的效果。

编辑:解决方案通过使用GlobalLayoutListener在根视图上 https://stackoverflow.com/a/4737265/2668136也可以代替(下面介绍的解决方案:)创建自定义视图组类。

您必须创建自己的视图组并将其作为布局中的父容器。它将实现一个将在 UI 类中处理的接口(Activity, Fragment, 任何)。我发现此博客用于检测 (~) 所有版本的 SKB 上的事件 http://tech.leolink.net/2014/02/a-hack-to-catch-soft-keyboard-showhide.html。根据它,这是视图组的类来处理高度的变化:

public class ContainerViewHandler extends RelativeLayout {

    private boolean isKeyboardShown;
    private onKeyboardStateChange listener;

    public ContainerViewHandler(Context context) {
        super(context);
    }

    public ContainerViewHandler(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ContainerViewHandler(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setKeyboardStateListener(onKeyboardStateChange listener) {
        this.listener = listener;
    }

    // Callbacks
    public interface onKeyboardStateChange {
        void onKeyboardShow();
        void onKeyboardHide();
    }

    @Override
    public boolean dispatchKeyEventPreIme(@NonNull KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            // Keyboard is hiding
            if (isKeyboardShown) {
                isKeyboardShown = false;
                listener.onKeyboardHide();
            }
        }
        return super.dispatchKeyEventPreIme(event);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int proposedHeight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();
        if (actualHeight > proposedHeight) {
            // Keyboard is showing
            if (!isKeyboardShown) {
                isKeyboardShown = true;
                listener.onKeyboardShow();
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

现在,您必须在布局中添加此视图组(例如<com.package.name.ContainerViewHandler .../>)。然后,你必须实现上面的接口setKeyboardStateListener在活动中,如下所示:

ContainerViewHandler containerView = 
          (ContainerViewHandler) findViewById(R.id.container_view);
containerView.setKeyboardStateListener(new ContainerHandler.onKeyboardStateChange() {
    @Override
    public void onKeyboardShow() {
        Log.v("onKeyboardShow()", "SoftKeyboard is showing. Hello!");
    }

    @Override
    public void onKeyboardHide() {
        Log.v("onKeyboardHide()", "SoftKeyboard is hiding, Bye bye!");
    }
});

因此,您可以管理不同的动画来处理和防止按钮直接“跳转”到 SKB 上方。为了测试这一点,我尝试重现反弹效果:

我的实现是这样的:

containerView.setKeyboardStateListener(new ContainerViewHandler.onKeyboardStateChange() {
    @Override
    public void onKeyboardShow() {
        setAnimationUp();
    }

    @Override
    public void onKeyboardHide() {
        setAnimationDown();
    }
});

private void setAnimationUp() {
    footerButton.setVisibility(View.GONE);
    float dpY = AppUtils.convertPxToDp(20, this); // custom conversion method

    Animation a1 = new TranslateAnimation(0, 0, footerButton.getHeight() * 4, -(dpY));
    a1.setDuration(250);
    a1.setFillAfter(true);

    final Animation a2 = new TranslateAnimation(0, 0, -(dpY), 0);
    a2.setDuration(320);
    a2.setFillAfter(true);

    a1.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            footerButton.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            footerButton.startAnimation(a2);
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }
    });

    footerButton.startAnimation(a1);
}

private void setAnimationDown() {
    float dpY = AppUtils.convertPxToDp(30, this); // custom conversion method
    Animation b1 = new TranslateAnimation(0, 0, -(dpY), dpY);
    b1.setDuration(300);
    b1.setFillAfter(true);

    final Animation b2 = new TranslateAnimation(0, 0, dpY, 0);
    b2.setDuration(320);
    b2.setFillAfter(true);

    b1.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) { }

        @Override
        public void onAnimationEnd(Animation animation) {
            footerButton.startAnimation(b2);
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }
    });

    footerButton.startAnimation(b1);
}

我首先在第一个回调中设置两个动画(a1,a2):

  • a1:从 SKB 下面(后面)开始(大约4xbutton's height)直至20dp它上面,
  • a2: 开始于20dp并返回到0dp(正常位置)。

第二个回调中还有另外两个 (b1, b2):

  • b1:从按钮到达的地方开始30dp在顶部并向下到30dp在父容器之外,
  • b2: 最后,从30dp out to 0dp(初始位置)。

PS:别忘了使用adjustResize在清单中并制作内容(例如我的测试中的编辑文本)above页脚按钮有alignParentBottom为真。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用动画调整大小 的相关文章

  • 安卓卸载通知

    当用户卸载应用程序时有什么方法可以发送通知 如果用户卸载该应用程序 应用程序所有者应该收到以下用户已卸载该应用程序的通知 是否可以 应用程序本身不可能 除非有来自同一作者的其他应用程序可以检查 但我认为有一个可用但复杂的解决方法 应用程序可
  • Android开放电话应用

    我只想打开 Android 设备的电话应用程序 我不想向该应用程序提供电话号码 只是想打开它 我正在使用手机应用程序的包名称来打开它 因为我可以使用下面的代码通过该包名称打开任何我想要的应用程序 Intent launchIntent ge
  • 如何从命令行向 Android 项目添加外部 jar 库

    我正在尝试构建一个具有一些依赖项的 Android 项目 jar 文件位于 lib 目录中 我可以通过将这些 jar 文件添加到我的类路径来构建项目 但当然它会在模拟器中强制关闭 因为这些库不存在 我正在使用 ant 从命令行执行此操作 n
  • 在 Android 中不断更新新的 JSON

    我有不断变化的 JSON 我需要在 android 中不断更新更改 我该怎么做 我的Android代码是 r getImage JSONObject data new JSONObject r String a data getString
  • 使用 ActionBar 选项卡进行导航时菜单会折叠

    我已经使用支持库中的 ActionBar 来将我的应用程序构建为选项卡式导航栏 我的应用程序中有两个选项卡 这两个片段都有菜单 并且有一个菜单项 我想将其显示为操作栏中的一项操作 但由于某种原因 显示了溢出图标 而不是分配给这些项目的图标
  • 无法在活动和远程服务之间共享 SharedPreferences - Android 错误或功能?

    我想在 SharedPreferences 更改时更新远程服务 以下内容用于 API 级别 8 Android 2 2 我的活动有一个OnPreferencesChangedListener它通过服务绑定器对象调用远程服务 远程服务的接口提
  • 此版本的渲染库比您的 ADT 插件版本更新。请更新ADT插件 - 已经更新

    在 Eclipse 上 尽管我使用的是最新的 adt 版本 但我收到此错误 我不确定它是否相关 但这发生在我安装 android m sdk 之后 从这里 https stackoverflow com a 30535515 933050
  • 尝试将 AndroidX 迁移到 Android AppCompat

    从 AndroidX 迁移到 Appcompat 时出现错误 这是日志构建 Manifest merger failed Attribute application appComponentFactory value android sup
  • 围绕右下角对齐图像

    我正在使用相对布局将一个较小的图像叠加在较大的图像之上 我希望较小图像的右下角与较大图像的 B R 角重合 我在布局 XML 中使用边距参数 指定倾斜测量 但这似乎不适用于所有设备和分辨率 在某些情况下 小图像会从边框移动 4 5 像素 是
  • Android 11 - 访问我的应用程序 Android/Data 文件夹中的文件

    由于某种原因 我真的很挣扎 希望有人能帮助我指明正确的方向 我的目标是 Android 11 API 30 这似乎是所有问题的根源 降低目标可能对我有用 但谷歌似乎最终会迫使我走上这条路 所以我不妨弄清楚这一点 我的应用程序通常会按照标准写
  • Android asmack:stateChange 从未被调用

    我正在使用 asmack xmpp 客户端构建一个聊天应用程序 聊天工作正常 我已经实施了ChatStateListener but stateChanged方法永远不会被调用 目前 为了获取撰写状态 我正在解析消息 xml 以下是撰写 文
  • 如何使用java.util.concurrent包实现后台线程?

    这是我首先使用的代码 但在最新的 Android 版本中AsyncTask类已被弃用并且 因此它没有响应 然后我使用了Thread类 但该类也不起作用 我想要与我得到的结果相同的结果AsyncTask班级 我知道我必须使用 java uti
  • 创建一个覆盖视图以覆盖整个活动,包括协调器布局中的工具栏

    我想创建一种覆盖类型的布局 以显示在包括工具栏在内的活动上方 我无法使用任何库来执行此操作 因为我编写的所有内容都是自定义的 我可以通过使用以下代码直接将视图添加到装饰视图来实现它 ViewGroup vg ViewGroup getWin
  • 从 Android 应用程序调用 Google 地图应用程序以获取行车方向

    我需要使用外部谷歌地图应用程序显示行车方向我找到了这个链接http developer android com guide appendix g app intents html http developer android com gui
  • android中textview截断一个字母

    这是我的 Android 设备的屏幕截图 文字是 asd 然而 d 被稍微切断了 这是相关视图
  • 全屏 Exoplayer

    我尝试用以下内容显示节目视频 mp4 外播放器 in 回收视图 and 浏览器 我展示了具有自定义布局的视频控制器 到目前为止 一切都很好 现在尝试像其他视频播放器一样全屏播放视频 但在中找不到好方法外播放器 doc 谁能帮我 ExoPla
  • 使用 Android API 发布推文

    我一直在寻找一种使用 Android 应用程序发布推文的方法 但我发现的所有方法都不起作用 我不得不承认 Twitter 的 API 并不是那么容易理解 但是我的代码并不长 而且我看不出我的错误在哪里 这是我的代码 public class
  • 总小时数无法从 Android 插入 MySQL

    我使用以下公式获得总小时数 public void updateTotalHours int a SplitTime objMyCustomBaseAdapter getFistTime int b SplitTime objMyCusto
  • 作业调度 API android L

    我正在制作一个使用 jobscheduler API 的应用程序 我想定期以及在设备充电时运行服务 这是代码 JobInfo Builder builder new JobInfo Builder kJobId mServiceCompon
  • 如何移动随 Visual Studio 2017 安装的 Android SDK 文件夹?

    我已将 VS 2017 安装在其默认路径 C 驱动器 中 但由于 Android 文件夹较大 它耗尽了我的大部分驱动器空间C Users USERNAME Local Android 该文件夹是由 VS 2017 安装程序自动创建的 如何将

随机推荐

  • 复选框的自定义图片?

    我想将复选框显示为切换按钮 但我无法使用 CCS 将自定义图片应用到它 仍然绘制复选框 如何完成这个任务呢 My CSS input type checkbox settingsbutton border style none backgr
  • Eloquent ORM(laravel 5) 是否负责 SQL 注入?

    我在网上找不到它 但是 Eloquent ORM 是否像 PDO 准备好的语句一样处理 SQL 注入 没有任何框架能够 处理 SQL 注入 You处理 SQL 注入 框架可以提供方便地执行此操作的方法 但您仍然必须一致地使用这些方法 例如
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • 在 Hive 中获取空值 使用 REGEX 创建和加载查询

    我有一个日志文件 我需要在其中使用 REGEX 存储数据 我尝试了下面的查询 但加载了所有 NULL 值 我已经检查了 REGEXhttp www regexr com http www regexr com 它对我的 数据工作正常 CRE
  • 从 VideoView 录制视频

    目前在做直播项目 成功实现视频直播 现在我的下一个任务是录制 VideoView 中正在播放的视频 我进行了搜索 能够找到捕获视频 但使用表面 相机 但在 VideoView 中我没有任何表面 任何帮助表示赞赏 你可以看到this http
  • 支持多屏幕的应用程序骨架

    正如我们所知 Android 随各种设备一起提供 这些设备具有不同的功能 功能 分辨率和屏幕尺寸 因此在开发支持的应用程序时 多个 小和大 屏幕存在尺寸和布局障碍 这导致了不同的组合屏幕尺寸 分辨率和 DPI这给 Android 设备的设计
  • gem install pg 错误:无法理解 Yosemite w/ Ruby 2.1.5 上的 kern.osversion `14.0.0'

    我使用 RVM 安装 Ruby 2 1 5 并再次运行捆绑包 现在 pg gem 无法安装 我收到此错误 gem install pg v 0 17 1 with pg config Applications Postgres app Co
  • c# 如何在 select 语句中指定 not ?

    我在数据集上使用 select 方法来检索符合我的条件的结果 foreach DataRow dr in dsPone2 Tables tt pone Select strWhereCondition dsPone Tables tt po
  • Tensorflow 中的平衡准确度分数

    我正在为高度不平衡的分类问题实现 CNN 并且我想在张量流中实现自定义指标以使用 选择最佳模型 回调 具体来说 我想实现平衡的准确度分数 这是每个类别的召回率的平均值 请参阅 sklearn 实现here https scikit lear
  • 如何将一个word文档的内容复制到另一个word文档中?

    我有一个包含一些文本和图像的Word文档 我想使用C 将word文档的内容复制到另一个word文档中 Thanks 尝试下面的代码 这可能对你有帮助 using System using System Collections Generic
  • Android 与 gms play 服务的依赖问题

    我收到一个错误 因为我正在尝试使用来自 Google 的应用程序索引库 同时还导入一个库 该库使用旧版本的 android gms 库作为不同的组件 来自 Google Play 服务的转换库 错误指出 所有 com google andr
  • delta Lake - 在 pyspark 中插入 sql 失败,并显示 java.lang.NoSuchMethodError: org.apache.spark.sql.catalyst.expressions.Alias

    Dataproc 集群是使用映像创建的2 0 x带有 Delta io 包io delta delta core 2 12 0 7 0 Spark版本是3 1 1 Spark shell 启动于 pyspark conf spark sql
  • “无法转换为 IComparer”

    我为装箱的RegistryItem对象定义了以下IComparer public class BoxedRegistryItemComparer IComparer public int Compare object left object
  • GPUImageAlphaBlendFilter 来自 GPUImageStillCamera 源的实时处理

    我正在使用 GPUImage 库 我正在尝试实时混合两个图像 并将它们显示在GPUImageView 我正在尝试将普通相机输入与其过滤版本进行 alpha 混合 这是我想做的 gt v camera alpha blend gt image
  • 多个docker容器日志

    我试图一次从多个 Docker 容器获取日志 顺序无关紧要 这将按预期工作 如果types ContainerLogsOption Follow设置为 false If types ContainerLogsOption Follow设置为
  • 获取鼠标下的窗口值

    我正在使用 Cocoa Objective C 我想问你是否可以从非活动窗口获取窗口信息 例如 pid 窗口名称 我的确切意思是 如果有两个不同任务的非全屏 也不是最大化 窗口 A 和 B 比如说 Chrome A 和 Firefox B
  • 是否可以在 C# 中为可空值和不可空值编写隐式转换运算符?

    我正在尝试写一个Alias课程使我能够 int n new Count 1 也就是说 它封装了一个int在这种情况下作为Count 它提供了一些类型安全性和域含义 同时它自动转换回底层类型 对于不可为空的引用类型 我还有另一个问题 我无法弄
  • 是否可以构造一个utf-8编解码器无法编码的unicode字符串?

    是否可以构造一个 unicode 字符串utf 8编解码器无法编码 从文档 https docs python org 2 library codecs html https docs python org 2 library codecs
  • Cocoa Touch - 使用叠加视图添加纹理

    我有一组作为 UIView 的图块 它们具有可编程的背景颜色 并且每个图块 可以是不同的颜色 我想为每一个添加纹理 比如侧光斜角 这可以通过覆盖视图或其他方法来完成吗 我正在寻找不需要为每种情况提供自定义图像文件的建议 这可能会对某人有所帮
  • 使用动画调整大小

    我用过android windowSoftInputMode 调整调整大小 在清单中防止键盘隐藏活动按钮 它可以工作 但是当键盘打开时 我的按钮会向上移动 这有点紧张 我想知道 我可以有任何动画让它顺利过渡吗