gpt4 book ai didi

android布局调整 parent 的大小而不调整 child 的大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:25 24 4
gpt4 key购买 nike

TLDR 版本:

当我调整父级大小时:

enter image description here

解释:

在 android 应用程序中,我有一个父布局,并且在其中有多个相关布局。

<LinearLayout
android:id="@+id/parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal" >

<RelativeLayout
android:id="@+id/child1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent">

</RelativeLayout>

<RelativeLayout
android:id="@+id/child2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent">

</RelativeLayout>
</LinearLayout>

这个布局的 child 里面有一些文字和图片。我正在做的是:

当用户点击一个按钮时,我想折叠父线性布局(动画宽度直到它为 0)。我已经实现了这个功能来做到这一点:

public static void collapseHorizontally(final View v) {
final int initialWidth = v.getMeasuredWidth();

Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().width = initialWidth - (int)(initialWidth * interpolatedTime);
v.requestLayout();
}
}

@Override
public boolean willChangeBounds() {
return true;
}
};

// 1dp/ms
long speed = (int)(initialWidth / v.getContext().getResources().getDisplayMetrics().density);
a.setDuration(speed);
v.startAnimation(a);
}

我在父 View 上调用上述函数。这工作正常,并且父 View 正在调整宽度直到它达到 0,然后我将他的可见性设置为消失。

我的问题

当父 View 调整大小(折叠)时, subview 也会随之调整大小。我的意思是,当父元素的宽度达到其中一个子元素时,子元素也会随之调整大小,这会导致其中的 TextView 也调整大小。

以下是示例的一些屏幕截图:

enter image description here

在这里你可以看到初始布局,有绿色的父布局和子布局(带有日期、文本和图标)。

然后,当我开始减小父布局的尺寸时,子布局的尺寸也会受到影响,它会减小其中的 textview 的尺寸,导致文字换行,如下图 2 所示:

enter image description here enter image description here

正如您注意到的那样,随着父级宽度的减小,子级中的文本被换行。

有没有办法让子元素不随父 View 调整大小,而是保持原样,即使父 View 大小正在减小?我需要 chil 元素的大小在整个调整大小动画期间保持固定,而不是被父级剪切而不是调整大小。

非常感谢您的帮助

最佳答案

您的问题来自多个问题。

  • 首先:TextViews 上的singleLine="false" 参数 >使用此参数,您不能要求它包装其内容,因为文本可以使用多行,因此没有适当的宽度。如果有多行,它将填充其父行。
  • second:“wrap_content”的行为是适应内容大小,除非它比父级大。在这种情况下,它将再次匹配父尺寸。 (我们可以看到,从填充或边距移动来看,边框是跟随父尺寸的。)

第二个问题可以通过使用固定大小来解决,但第一点不是这样:

您可以设置 singleLine="true",使用 android:width="wrap_content" 以查看它在单行上工作。 (设置 android:ellipsize="none" 以隐藏移动的'...')但是单行文本不是您需要的,对吧?

我已经对 TextView 进行了扩展,以避免调整这些 View 的大小,即使是多行也是如此:

public class NoResizeTextView extends TextView {

int firstWidth = -1;
int firstHeight = -1;

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

Layout layout = getLayout();
if (layout != null) {

if (firstWidth == -1)
firstWidth = getMeasuredWidth();
if (firstHeight == -1)
firstHeight = getMeasuredHeight();

setMeasuredDimension(firstWidth, firstHeight);
}
}

}

然后在您的布局中使用此 TextView 扩展:

       <com.guian.collapsetest.NoResizeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="none"
android:singleLine="false"
android:text="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit" >
</com.guian.collapsetest.NoResizeTextView>

这不是很漂亮,我不建议使用太多,因为它可能会破坏 android 的布局机制。但在您的特定情况下,我想它可以完成这项工作。

逻辑:

当您扩展 View 以创建自定义 View 时,您负责onMeasure 的实现。这就是它的大小给你的观点。这就是它的工作原理:你计算一次大小(或者让默认函数为你完成而不是 getMeasuredW/H)并保存它,然后在每次请求大小时,你只返回相同的值,这样您的 View 大小就不会改变。

限制:

因为您的 View 大小不会改变,所以当更改屏幕方向/父级大小时或再次更改内部文本时(如 Vikram 所说),它可能会出现不良行为。这就是我所说的“打破 android 布局机制”。如果您需要动态更改文本,则必须扩展 setText 方法以允许它在此时调整大小 ...

关于android布局调整 parent 的大小而不调整 child 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23856302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com