IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 处理软键盘遮挡问题 -> 正文阅读

[移动开发]Android 处理软键盘遮挡问题

Android 处理软键盘遮挡问题

需要达到的效果:

在这里插入图片描述

方式一:使用scrollTo

当软键盘弹起时,通过scrollTo滚动出被遮挡的地方。

监听软键盘状态工具类

public class SoftKeyboardListener {

    private static int lastVisibleHeight = 0;

    public interface OnSoftKeyboardListener {
        void showKeyboard(int keyboardHeight, int diff);

        void hideKeyboard(int keyboardHeight);
    }

    public static void registerListener(@NotNull Activity activity, @NotNull OnSoftKeyboardListener listener) {
        lastVisibleHeight = 0;
        View rootView = activity.getWindow().getDecorView();
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                rootView.getWindowVisibleDisplayFrame(rect);
                int visibleHeight = rect.height();
                if (lastVisibleHeight == 0) {
                    lastVisibleHeight = visibleHeight;
                } else {
                    if (lastVisibleHeight > visibleHeight) {
                        int keyboardHeight = lastVisibleHeight - visibleHeight;
                        if (keyboardHeight > 200) {
                            listener.showKeyboard(keyboardHeight, visibleHeight);
                            lastVisibleHeight = visibleHeight;
                        }
                    } else if (lastVisibleHeight < visibleHeight) {
                        int keyboardHeight = visibleHeight - lastVisibleHeight;
                        if (keyboardHeight > 200) {
                            listener.hideKeyboard(keyboardHeight);
                            lastVisibleHeight = visibleHeight;
                        }
                    }
                }
            }
        });
    }
}

XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/root"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                tools:context=".LoginActivity">

    <ImageView
               android:layout_width="100dp"
               android:layout_height="100dp"
               android:layout_centerHorizontal="true"
               android:layout_marginTop="120dp"
               android:src="@mipmap/ic_launcher_round" />

    <LinearLayout
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:layout_marginLeft="15dp"
                  android:layout_marginRight="15dp"
                  android:orientation="vertical">

        <LinearLayout
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_marginTop="300dp"
                      android:gravity="center"
                      android:orientation="horizontal">

            <ImageView
                       android:layout_width="35dp"
                       android:layout_height="35dp"
                       android:src="@drawable/user" />

            <EditText
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:hint="请输入用户名" />
        </LinearLayout>

        <LinearLayout
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_marginTop="20dp"
                      android:gravity="center"
                      android:orientation="horizontal">
            <ImageView
                       android:layout_width="35dp"
                       android:layout_height="35dp"
                       android:src="@drawable/pwd" />

            <EditText
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:hint="请输入密码" />
        </LinearLayout>

        <Button
                android:id="@+id/confirm"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:text="确定" />

        <RelativeLayout
                        android:id="@+id/help"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_alignParentBottom="true"
                        android:orientation="horizontal"
                        android:padding="10dp">

            <TextView
                      android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:layout_alignParentLeft="true"
                      android:text="忘记密码" />

            <TextView
                      android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:layout_alignParentRight="true"
                      android:text="注册" />
        </RelativeLayout>
    </LinearLayout>

    <LinearLayout
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_alignParentBottom="true"
                  android:gravity="center"
                  android:orientation="horizontal"
                  android:padding="10dp">

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="联系客服" />

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="10dp"
                  android:layout_marginRight="10dp"
                  android:text="|" />

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="关于我们" />
    </LinearLayout>
</RelativeLayout>

逻辑代码

class LoginActivity2 : AppCompatActivity() {
    private lateinit var root: RelativeLayout
    private lateinit var help: View
    private lateinit var confirm: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login2)
        root = findViewById(R.id.root)
        help = findViewById(R.id.help)
        confirm = findViewById(R.id.confirm)

        SoftKeyboardListener.registerListener(this, object : OnSoftKeyboardListener {
            override fun showKeyboard(keyboardHeight: Int, diff: Int) {
                root.scrollTo(0, help.bottom - diff)
            }

            override fun hideKeyboard(keyboardHeight: Int) {
                root.scrollTo(0, 0)
            }
        })
    }
}

方式二:使用NestedScrollView

scrollTo比较生硬,使用NestedScrollView + 动画会有一个滑动效果。

XML布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                tools:context=".LoginActivity">

    <ImageView
               android:id="@+id/logo"
               android:layout_width="100dp"
               android:layout_height="100dp"
               android:layout_centerHorizontal="true"
               android:layout_marginTop="120dp"
               android:src="@mipmap/ic_launcher_round" />

    <androidx.core.widget.NestedScrollView
                                           android:id="@+id/scrollView"
                                           android:layout_width="match_parent"
                                           android:layout_height="match_parent"
                                           android:fillViewport="true"
                                           android:scrollbarThumbVertical="@android:color/transparent"
                                           android:scrollbars="vertical">

        <LinearLayout
                      android:id="@+id/wrapper"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      android:layout_marginLeft="15dp"
                      android:layout_marginRight="15dp"
                      android:orientation="vertical">

            <LinearLayout
                          android:layout_width="match_parent"
                          android:layout_height="wrap_content"
                          android:layout_marginTop="300dp"
                          android:gravity="center"
                          android:orientation="horizontal">

                <ImageView
                           android:layout_width="35dp"
                           android:layout_height="35dp"
                           android:src="@drawable/user" />

                <EditText
                          android:layout_width="match_parent"
                          android:layout_height="wrap_content"
                          android:hint="请输入用户名" />

            </LinearLayout>

            <LinearLayout
                          android:layout_width="match_parent"
                          android:layout_height="wrap_content"
                          android:layout_marginTop="20dp"
                          android:gravity="center"
                          android:orientation="horizontal">

                <ImageView
                           android:layout_width="35dp"
                           android:layout_height="35dp"
                           android:src="@drawable/pwd" />

                <EditText
                          android:layout_width="match_parent"
                          android:layout_height="wrap_content"
                          android:hint="请输入密码" />

            </LinearLayout>

            <Button
                    android:id="@+id/confirm"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:text="确定" />

            <RelativeLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_alignParentBottom="true"
                            android:orientation="horizontal"
                            android:padding="10dp">

                <TextView
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:layout_alignParentLeft="true"
                          android:text="忘记密码" />

                <TextView
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:layout_alignParentRight="true"
                          android:text="注册" />
            </RelativeLayout>
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>

    <LinearLayout
                  android:id="@+id/helper"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_alignParentBottom="true"
                  android:gravity="center"
                  android:orientation="horizontal"
                  android:padding="10dp">

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="联系客服" />

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="10dp"
                  android:layout_marginRight="10dp"
                  android:text="|" />

        <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="关于我们" />

    </LinearLayout>

</RelativeLayout>

逻辑代码

class LoginActivity : AppCompatActivity() {
    private lateinit var scrollView: NestedScrollView
    private lateinit var helper: LinearLayout
    private lateinit var wrapper: LinearLayout
    private lateinit var logo: ImageView
    private lateinit var confirm: Button

    private var screenHeight = 0 //屏幕高度
    private var keyboardHeight = 0 //键盘高度

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        BarUtils.setTransparentStatusBar(this)
        scrollView = findViewById(R.id.scrollView)
        helper = findViewById(R.id.helper)
        wrapper = findViewById(R.id.wrapper)
        logo = findViewById(R.id.logo)
        confirm = findViewById(R.id.confirm)

        confirm.setOnClickListener { KeyboardUtils.hideKeyboard(confirm) }

        screenHeight = Resources.getSystem().displayMetrics.heightPixels
        keyboardHeight = screenHeight / 3

        scrollView.setOnTouchListener { v, event -> true }

        scrollView.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
            if (oldBottom != 0 && bottom != 0) {
                if ((oldBottom - bottom) > keyboardHeight) {
                    //软键盘展开
                    val diff = wrapper.bottom - bottom
                    if (diff > 0) {
                        //比较生硬
//                        scrollView.smoothScrollBy(0, diff)
                        AnimatorUtils.translationY(wrapper, 0F, (-diff).toFloat())
                        AnimatorUtils.scale(logo, 1F, 0.6F)
                    }
                    helper.visibility = View.INVISIBLE
                } else if ((bottom - oldBottom) > keyboardHeight) {
                    //软键盘收起
                    val diff = wrapper.bottom - oldBottom
                    if (diff > 0) {
                        //比较生硬
//                        scrollView.smoothScrollBy(0, -diff)
                        AnimatorUtils.translationY(wrapper, wrapper.translationY, 0F)
                        AnimatorUtils.scale(logo, 0.6F, 1F)
                    }
                    helper.visibility = View.VISIBLE
                }
            }
        }
    }
}

动画

object AnimatorUtils {

    /**
     * Y轴移动动画
     */
    fun translationY(view: View, from: Float, to: Float) {
        ObjectAnimator.ofFloat(view, TRANSLATION_Y, from, to).apply {
            duration = 300L
        }.start()
    }

    /**
     * 缩放动画
     */
    fun scale(view: View, fromScale: Float, toScale: Float) {
        view.apply {
            pivotX = (view.width / 2).toFloat()
            pivotY = (view.height / 2).toFloat()
        }
        val animatorScaleX = ObjectAnimator.ofFloat(view, SCALE_X, fromScale, toScale)
        val animatorScaleY = ObjectAnimator.ofFloat(view, SCALE_Y, fromScale, toScale)
        AnimatorSet().apply {
            duration = 300L
            playTogether(animatorScaleX, animatorScaleY);
        }.start()
    }
}

代码下载

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:54:07  更:2022-04-18 17:57:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:12:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码