Skip to content

Commit 8f2ab49

Browse files
committed
feat: 添加多EditText、多Window的示例代码
1 parent a546f3a commit 8f2ab49

File tree

5 files changed

+109
-26
lines changed

5 files changed

+109
-26
lines changed

app/src/main/kotlin/com/xiaocydx/inputview/sample/ImeAnimatorActivity.kt

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import androidx.appcompat.app.AppCompatActivity
55
import androidx.core.view.updatePadding
66
import com.xiaocydx.inputview.InputView
77
import com.xiaocydx.inputview.addAnimationCallback
8+
import com.xiaocydx.inputview.addEditText
89
import com.xiaocydx.inputview.animator
910
import com.xiaocydx.inputview.init
1011
import com.xiaocydx.inputview.sample.databinding.ActivityImeAnimatorBinding
11-
import com.xiaocydx.insets.handleGestureNavBarEdgeToEdgeOnApply
12+
import com.xiaocydx.insets.insets
1213

1314
/**
1415
* `InputView.animator()`的示例代码
@@ -27,15 +28,28 @@ class ImeAnimatorActivity : AppCompatActivity() {
2728
}
2829

2930
private fun ActivityImeAnimatorBinding.init() = apply {
30-
val animator = InputView.animator(window, editText)
31-
// 1. 点击imageView,隐藏IME
31+
// 1. 当有多个EditText时,选其中一个EditText创建ImeAnimator即可,
32+
// 多个EditText的焦点处理逻辑,可以看InputView.animator()的注释。
33+
val animator = InputView.animator(window, editText1)
34+
35+
// 2. 创建animator的EditText会自动处理水滴状指示器导致动画卡顿问题,
36+
// 若其它EditText也需要处理,则调用InputView.addEditText()完成添加。
37+
InputView.addEditText(window, editText2)
38+
39+
// 3. 点击imageView,隐藏IME
3240
imageView.onClick(animator::hideIme)
33-
// 2. 当支持手势导航栏EdgeToEdge时,设置etContainer.paddingBottom
34-
etContainer.handleGestureNavBarEdgeToEdgeOnApply()
35-
// 3. 显示和隐藏IME,运行动画设置root.paddingBottom
41+
42+
// 4. 当支持手势导航栏EdgeToEdge时,设置etContainer.paddingBottom
43+
etContainer.insets().gestureNavBarEdgeToEdge()
44+
45+
// 5. 显示和隐藏IME,运行动画设置root.paddingBottom
3646
animator.addAnimationCallback(onUpdate = { state ->
3747
val bottom = state.currentOffset - state.navBarOffset
3848
root.updatePadding(bottom = bottom.coerceAtLeast(0))
3949
})
50+
51+
// 5. 碰到OverlayInputActivity的多Window交互问题,仍可以通过动画拦截器解决
52+
// animator.setWindowFocusInterceptor()
53+
// imageView.onClick { InputDialog(this@ImeAnimatorActivity).show() }
4054
}
4155
}

app/src/main/kotlin/com/xiaocydx/inputview/sample/OverlayInputActivity.kt

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
package com.xiaocydx.inputview.sample
22

3+
import android.app.Dialog
4+
import android.content.Context
35
import android.os.Bundle
6+
import android.view.WindowInsets
7+
import android.widget.EditText
48
import androidx.appcompat.app.AppCompatActivity
9+
import androidx.appcompat.app.AppCompatDialog
10+
import androidx.appcompat.widget.AppCompatEditText
511
import androidx.core.view.isInvisible
12+
import com.xiaocydx.inputview.AnimationInterceptor
13+
import com.xiaocydx.inputview.Editor
14+
import com.xiaocydx.inputview.EditorAnimator
615
import com.xiaocydx.inputview.InputView
716
import com.xiaocydx.inputview.addAnimationCallback
17+
import com.xiaocydx.inputview.addEditText
818
import com.xiaocydx.inputview.init
9-
import com.xiaocydx.inputview.notifyHideIme
19+
import com.xiaocydx.inputview.notifyHideCurrent
1020
import com.xiaocydx.inputview.sample.databinding.ActivityOverlayInputBinding
21+
import com.xiaocydx.inputview.setWindowFocusInterceptor
1122

1223
/**
1324
* 覆盖输入的示例代码
@@ -24,16 +35,47 @@ class OverlayInputActivity : AppCompatActivity() {
2435
}
2536

2637
private fun ActivityOverlayInputBinding.init() = apply {
27-
inputView.editText = editText
38+
// 1. 当有多个EditText时,选其中一个EditText跟InputView关联即可,
39+
// 多个EditText的焦点处理逻辑,可以看InputView.editText的注释。
40+
inputView.editText = editText1
41+
42+
// 2. 关联InputView的EditText会自动处理水滴状指示器导致动画卡顿问题,
43+
// 若其它EditText也需要处理,则调用InputView.addEditText()完成添加。
44+
InputView.addEditText(window, editText2)
45+
46+
// 3. 运行动画时,修改outside.alpha和outside.isInvisible
2847
inputView.editorAnimator.addAnimationCallback(
2948
onStart = { outside.isInvisible = false },
3049
onEnd = { outside.isInvisible = it.endOffset == 0 },
3150
onUpdate = {
32-
val fraction = it.animatedFraction
51+
// 更改IME高度运行的动画,不需要改变outside.alpha
52+
val fraction = if (it.startOffset > 0 && it.endOffset > 0) 1f else it.animatedFraction
3353
outside.alpha = if (it.endOffset > 0) fraction else 1 - fraction
3454
}
3555
)
56+
57+
// 4. 设置window.decorView.hasWindowFocus()的动画拦截器,
58+
// 点击Dialog的EditText显示IME,不更改Editor且不运行动画。
59+
inputView.editorAnimator.setWindowFocusInterceptor()
3660
inputView.setEditorBackgroundColor(0xFFF2F2F2.toInt())
37-
outside.onClick { inputView.editorAdapter.notifyHideIme() }
61+
62+
outside.onClick { inputView.editorAdapter.notifyHideCurrent() }
63+
textView.onClick { InputDialog(this@OverlayInputActivity).show() }
64+
}
65+
}
66+
67+
/**
68+
* 点击[Dialog]的[EditText]显示IME,[InputView]所在的Window视图树会分发[WindowInsets],
69+
* 这会导致[Editor]更改为IME,运行IME动画,[EditorAnimator.setWindowFocusInterceptor]
70+
* 是解决这类问题的便捷函数,若有更多的拦截条件,则自行实现和组合[AnimationInterceptor]。
71+
*/
72+
class InputDialog(context: Context) : AppCompatDialog(context) {
73+
74+
override fun onCreate(savedInstanceState: Bundle?) {
75+
super.onCreate(savedInstanceState)
76+
val editText = AppCompatEditText(context)
77+
editText.hint = "点击显示IME"
78+
editText.layoutParams(200.dp, 50.dp)
79+
setContentView(editText)
3880
}
3981
}

app/src/main/kotlin/com/xiaocydx/inputview/sample/edit/VideoEditActivity.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ import com.xiaocydx.inputview.sample.edit.VideoEditor.Text
2727
import com.xiaocydx.inputview.sample.edit.VideoEditor.Video
2828
import com.xiaocydx.inputview.sample.isDispatchTouchEventEnabled
2929
import com.xiaocydx.inputview.sample.onClick
30-
import com.xiaocydx.insets.doOnApplyWindowInsets
31-
import com.xiaocydx.insets.handleGestureNavBarEdgeToEdgeOnApply
32-
import com.xiaocydx.insets.statusBarHeight
33-
import com.xiaocydx.insets.updateMargins
30+
import com.xiaocydx.insets.insets
31+
import com.xiaocydx.insets.statusBars
3432
import kotlinx.coroutines.flow.distinctUntilChanged
3533
import kotlinx.coroutines.flow.launchIn
3634
import kotlinx.coroutines.flow.mapLatest
@@ -164,9 +162,7 @@ class VideoEditActivity : AppCompatActivity() {
164162
// 禁用手势导航栏偏移,自行处理手势导航栏
165163
inputView.disableGestureNavBarOffset()
166164
// 设置通用的手势导航栏EdgeToEdge处理逻辑
167-
space.handleGestureNavBarEdgeToEdgeOnApply()
168-
preview.doOnApplyWindowInsets { view, insets, initialState ->
169-
view.updateMargins(top = initialState.params.marginTop + insets.statusBarHeight)
170-
}
165+
space.insets().gestureNavBarEdgeToEdge()
166+
preview.insets().margins(statusBars())
171167
}
172168
}

app/src/main/res/layout/activity_ime_animator.xml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,38 @@
1212
android:scaleType="centerCrop"
1313
android:src="@mipmap/ic_launcher" />
1414

15-
<FrameLayout
15+
<LinearLayout
1616
android:id="@+id/etContainer"
1717
android:layout_width="match_parent"
1818
android:layout_height="wrap_content"
1919
android:background="#F2F2F2"
20+
android:orientation="vertical"
2021
android:paddingTop="6dp">
2122

2223
<EditText
23-
android:id="@+id/editText"
24+
android:id="@+id/editText1"
2425
android:layout_width="match_parent"
2526
android:layout_height="wrap_content"
2627
android:layout_marginHorizontal="6dp"
2728
android:layout_marginBottom="6dp"
2829
android:background="@color/white"
2930
android:gravity="center_vertical"
31+
android:hint="点击EdiText1显示IME"
3032
android:minHeight="38dp"
3133
android:padding="5dp"
3234
android:textSize="15sp" />
33-
</FrameLayout>
35+
36+
<EditText
37+
android:id="@+id/editText2"
38+
android:layout_width="match_parent"
39+
android:layout_height="wrap_content"
40+
android:layout_marginHorizontal="6dp"
41+
android:layout_marginBottom="6dp"
42+
android:background="@color/white"
43+
android:gravity="center_vertical"
44+
android:hint="点击EdiText2显示IME"
45+
android:minHeight="38dp"
46+
android:padding="5dp"
47+
android:textSize="15sp" />
48+
</LinearLayout>
3449
</LinearLayout>

app/src/main/res/layout/activity_overlay_input.xml

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
android:layout_height="match_parent">
55

66
<TextView
7+
android:id="@+id/textView"
78
android:layout_width="match_parent"
89
android:layout_height="match_parent"
9-
android:gravity="center"
1010
android:background="#A8C8D6"
11-
android:text="OverlayInput"
11+
android:gravity="center"
12+
android:text="点击显示Dialog"
1213
android:textSize="22sp" />
1314

1415
<com.xiaocydx.inputview.InputView
@@ -29,24 +30,39 @@
2930
android:background="#66000000"
3031
android:visibility="invisible" />
3132

32-
<FrameLayout
33+
<LinearLayout
3334
android:layout_width="match_parent"
3435
android:layout_height="wrap_content"
3536
android:background="#F2F2F2"
37+
android:orientation="vertical"
3638
android:paddingTop="6dp">
3739

3840
<EditText
39-
android:id="@+id/editText"
41+
android:id="@+id/editText1"
42+
android:layout_width="match_parent"
43+
android:layout_height="wrap_content"
44+
android:layout_marginHorizontal="6dp"
45+
android:layout_marginBottom="6dp"
46+
android:background="@color/white"
47+
android:gravity="center_vertical"
48+
android:hint="点击EditText1显示IME"
49+
android:minHeight="38dp"
50+
android:padding="5dp"
51+
android:textSize="15sp" />
52+
53+
<EditText
54+
android:id="@+id/editText2"
4055
android:layout_width="match_parent"
4156
android:layout_height="wrap_content"
4257
android:layout_marginHorizontal="6dp"
4358
android:layout_marginBottom="6dp"
4459
android:background="@color/white"
4560
android:gravity="center_vertical"
61+
android:hint="点击EditText2显示IME"
4662
android:minHeight="38dp"
4763
android:padding="5dp"
4864
android:textSize="15sp" />
49-
</FrameLayout>
65+
</LinearLayout>
5066
</LinearLayout>
5167
</com.xiaocydx.inputview.InputView>
5268
</FrameLayout>

0 commit comments

Comments
 (0)