android设置宽高
Ⅰ Android 自定义View:为什么你设置的wrap_content不起作用
在使用自定义View时,View宽 / 高的 wrap_content 属性不起自身应有的作用,而且是起到与 match_parent 相同作用。
其实这里有两个问题:
请分析 & 解决问题之前,请先看自定义View原理中 (2)自定义View Measure过程 - 最易懂的自定义View原理系列
问题出现在View的宽 / 高设置,那我们直接来看自定义View绘制中第一步对View宽 / 高设置的过程:measure过程中的 onMeasure() 方法
继续往下看 getDefaultSize()
从上面发现:
那么有人会问:wrap_content和match_parent具有相同的效果,为什么是填充父容器的效果呢?
我们知道,子View的MeasureSpec值是根据子View的布局参数(LayoutParams)和父容器的MeasureSpec值计算得来,具体计算逻辑封装在getChildMeasureSpec()里。
接下来,我们看生成子View MeasureSpec的方法: getChildMeasureSpec() 的源码分析:
getChildMeasureSpec()
从上面可以看出,当子View的布局参数使用 match_parent 或 wrap_content 时:
所以: wrap_content 起到了和 match_parent 相同的作用:等于父容器当前剩余空间大小
当自定义View的布局参数设置成wrap_content时时,指定一个默认大小(宽 / 高)。
这样,当你的自定义View的宽 / 高设置成wrap_content属性时就会生效了。
网上流传着这么一个解决方案:
答: 是,当父View为 AT_MOST 、View为 match_parent 时,该View的 match_parent 的效果就等于 wrap_content 。上述方法存在逻辑错误,但由于这种情况非常特殊的,所以导致最终的结果没有错误。具体分析请看下面例子:
从上面的效果可以看出,View大小 = 默认值
我再将子View的属性改为 wrap_content :
从上面的效果可以看出,View大小还是等于默认值。
相信看到这里你已经看懂了:
为了更好的表示判断逻辑,我建议你们用本文提供的解决方案,即根据布局参数判断默认值的设置
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
Ⅱ Android中测量控件的内部文字内容的宽、高度
在Android中,自定义View时通过Canvas绘制文字时,测量控件内部文字内容的宽、高是关键步骤。本文将介绍几种常用方法,旨在帮助开发者解决这一问题。
首先,可通过`Paint.measureText`方法测量文本的宽度。这是一个快捷方式,适用于快速获取文本宽度信息。
其次,使用`Paint.getTextBounds`方法,可以获得文字所在矩形区域,进而得到宽度和高度。该方法更为全面,适用于需要精确测量场景。
`Paint.getTextWidths`方法同样提供每个字符的宽度信息,对于处理多字符文本布局问题非常有用。
通过`Paint.FontMetrics`或`Paint.FontMetricsInt`可以获取高度。两者主要区别在于精度,前者为float,后者为int,具体使用时需根据需求选择。
获取高度时,注意到两个高度值略有不同,`height2`值略大于`height1`,以保证文本顶部和底部有足够的留白。在实际应用中,需根据具体需求选择合适的高度值。
此外,通过`Paint.getFontSpacing`和`Paint.getFontMetrics(null)`方法获取高度,本质上是调用`Paint.getFontMetrics`实现的。获取的高度值与`fontMetrics.descent - fontMetrics.ascent`计算结果一致。
`Layout.getDesiredWidth`方法用于获取宽度信息,但在TextView布局中可能存在文字实际占用高度与属性`textSize`值不一致的问题。文档中提示可通过设置`android:includeFontPadding`来控制是否包含上下空白。
总结而言,Android中测量文字内容宽、高有多种方法,开发者需根据具体需求选择合适的方法。理解不同方法的特性和应用场景,有助于更精确地控制文字布局,提升应用界面的美观性和用户体验。
Ⅲ android 开发的时候怎么动态设置控件宽高
1、获取控件所在的布局
java">LayoutParamspara=button.getLayoutParams();//获取按钮的布局
2、修改布局中的height,width属性
para.width=200;//修改宽度
para.height=300;//修改高度
3、重新设置修改后的布局给控件
button.setLayoutParams(para);//设置修改后的布局。