- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
TLDR 版本:
当我调整父级大小时:
解释:
在 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 也调整大小。
以下是示例的一些屏幕截图:
在这里你可以看到初始布局,有绿色的父布局和子布局(带有日期、文本和图标)。
然后,当我开始减小父布局的尺寸时,子布局的尺寸也会受到影响,它会减小其中的 textview 的尺寸,导致文字换行,如下图 2 所示:
正如您注意到的那样,随着父级宽度的减小,子级中的文本被换行。
有没有办法让子元素不随父 View 调整大小,而是保持原样,即使父 View 大小正在减小?我需要 chil 元素的大小在整个调整大小动画期间保持固定,而不是被父级剪切而不是调整大小。
非常感谢您的帮助
最佳答案
您的问题来自多个问题。
TextViews
上的singleLine="false"
参数 >使用此参数,您不能要求它包装其内容,因为文本可以使用多行,因此没有适当的宽度。如果有多行,它将填充其父行。第二个问题可以通过使用固定大小来解决,但第一点不是这样:
您可以设置 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/
我最近开始使用无表格 CSS 编写我所有的布局,但仍然更喜欢旧表格样式。快多了。无论如何,我陷入了这个即将完成的布局,但我需要一个小细节的帮助,我无法修复。 这里是测试地址: http://www.s
我正在尝试将节点形状的大小调整为节点文本的大小。我按照 https://github.com/cytoscape/cytoscape.js/issues/649 的指示进行操作。但是: 形状始终以高度
我是一名优秀的程序员,十分优秀!