
[英]how Do i make my TextView Font Size Change Dynamically depending upon the Parent View Size
[英]Transitions: How to change parent view size after transition is finished?
在我的应用程序中,我具有线性的视图布局。 这些视图的大小可能会因其自身布局的更改而改变。 特别地,第一视图( sceneRoot
)由可隐藏部分( view1
)和始终可见的部分( view2
)组成。 我想通过两个步骤来动画化view1
的出现和消失:
到目前为止的结果是:
问题在于,一旦view1
更改可见性, sceneRoot
就会立即更改其边界。 view3
跳到其新位置,使消失的过渡看起来更view3
。
理想情况下,我希望sceneRoot
的高度sceneRoot
进行动画处理。 如果这无法实现,我希望在完成消失过渡之后而不是在开始之前改变高度。
这是有问题的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/scene_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/view_1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/holo_red_light"
android:gravity="center"
android:text="View 1 (Hideable)"
android:textSize="24sp" />
<TextView
android:id="@+id/view_2"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@android:color/holo_orange_light"
android:gravity="center"
android:text="View 2"
android:textSize="24sp" />
</LinearLayout>
<TextView
android:id="@+id/view_3"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/holo_green_dark"
android:gravity="center"
android:text="View 3"
android:textSize="24sp" />
</LinearLayout>
在这个简化的示例中,一个LinearLayout
就足够了。 但是,在现实生活中,布局平坦化并不是那么容易实现。
这是我更改view1
可见性的方法:
private fun toggleView1Visibility() {
TransitionManager.endTransitions(sceneRoot)
val isView1Appearing = view1.visibility != View.VISIBLE
TransitionManager.beginDelayedTransition(
sceneRoot,
createTransition(isView1Appearing)
)
view1.visibility = if (isView1Appearing) View.VISIBLE else View.GONE
}
private fun createTransition(
isView1Appearing: Boolean
): Transition {
val view1Fade = Fade().apply {
addTarget(view1)
duration = 750
}
val view2ChangeBounds = ChangeBounds().apply {
addTarget(view2)
duration = 750
}
return TransitionSet().apply {
ordering = TransitionSet.ORDERING_SEQUENTIAL
if (isView1Appearing) {
addTransition(view2ChangeBounds)
addTransition(view1Fade)
} else {
addTransition(view1Fade)
addTransition(view2ChangeBounds)
}
}
}
在不求助于拼合平面的情况下,我必须解决哪些选项?
谢谢。
显然,过渡目标没有场景根的直接子代。
向ChangeBounds()
添加更多目标可以达到ChangeBounds()
:
private fun createTransition(
isView1Appearing: Boolean
): Transition {
val view1Fade = Fade().apply {
addTarget(view1)
duration = 750
}
val changeBounds = ChangeBounds().apply {
addTarget(sceneRoot)
addTarget(view2)
addTarget(view3)
duration = 750
}
return TransitionSet().apply {
ordering = TransitionSet.ORDERING_SEQUENTIAL
if (isView1Appearing) {
addTransition(changeBounds)
addTransition(view1Fade)
} else {
addTransition(view1Fade)
addTransition(changeBounds)
}
}
}
希望对某人有用。
如果您找到答案,那就太好了。 我在这里也添加了一个Answer,尽管它在Java中,因为我对kotlin不太了解。
private void toggleView1Visibility() {
final int originalDimension = sceneRoot.getHeight();
final int newDimension =sceneRoot.getHeight();
Boolean isView1Appearing = view1.getVisibility() != View.VISIBLE;
TransitionManager.beginDelayedTransition(sceneRoot, new TransitionSet()
.addTransition(new ChangeBounds()));
if (isView1Appearing){
ViewGroup.LayoutParams params = sceneRoot.getLayoutParams();
params.height = newDimension;
sceneRoot.setLayoutParams(params);
view1.setVisibility(View.VISIBLE );
}
else {
TransitionManager.beginDelayedTransition(sceneRoot, new TransitionSet()
.addTransition(new ChangeBounds()));
ViewGroup.LayoutParams params = sceneRoot.getLayoutParams();
params.height = originalDimension;
sceneRoot.setLayoutParams(params);
view1.setVisibility(View.GONE);
}
}
请记住,这里的sceneroot是布局的父级LL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.