当前位置: 首页 > news >正文

Android Studio新手开发第二十六天

目录

视图构建过程(二)

视图的测量方法

1.文本尺寸测量

2.图形尺寸测量

3.布局尺寸测量

视图构建过程(二)

        之前介绍过视图的四个构造方法以及用法,这是自定义控件的第一步,接下来要介绍视图的测量方法。

视图的测量方法

        自定义控件的第二步是测量尺寸,需要重写onMeasure方法。控件的宽高在xml文件中分别由layout_width属性和layout_height属性规定。它们有3种赋值方式,match_parent、wrap_content与具体的数值。第一种与第三种的值获取比较简单,要么取上级视图的数值,要么取具体数值。比较难的是第二种,它需要知道视图自身的尺寸。Android提供了相关的测量方法,支持在不同情况下测量尺寸。需要测量的实体主要有三种,分别为文本尺寸。图形尺寸以及布局尺寸。

1.文本尺寸测量

        文本尺寸分为文本的宽度和高度,需要根据文本的大小分别计算。文本宽度可以使用Paint类的measureText方法测量,示例代码如下。

        Paint paint = new Paint();paint.setTextSize(20);//设置文本的大小,参数单位为sppaint.measureText("MeasureText");//设置测量文本,返回值单位为px

        文本高度的计算较为复杂,计算高度用到FontMetrics类,该类提供了五个与高度相关的属性,如下表所示。

距离属性说明
top行的顶部与基线的距离
ascent字符的顶部与基线的距离
descent字符的底部与基线的距离
bottom行的底部与基线的距离
leading行间距

        示例代码如下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".CustomWidget.MeasureTextActivity"android:orientation="vertical"><TextViewandroid:id="@+id/textView_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/app_name"android:textSize="20sp"/><TextViewandroid:id="@+id/textView_2"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>

        部分Java代码如下。

public class MeasureTextActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_measure_text);TextView textView_1, textView_2;textView_1 = findViewById(R.id.textView_1);textView_2 = findViewById(R.id.textView_2);float width = getWidth(textView_1.getText().toString(), textView_1.getTextSize());float height = getHeight(textView_1.getText().toString(), textView_1.getTextSize());String string = String.format("上面文本的大小为%.0fpx,宽度为%.0fpx,高度为%.0fpx", textView_1.getTextSize(), width, height);textView_2.setText(string);}public float getWidth(String text, float textSize) {if (TextUtils.isEmpty(text)) {return 0;}Paint paint = new Paint();paint.setTextSize(textSize);return paint.measureText(text);}public float getHeight(String text, float textSize) {if (TextUtils.isEmpty(text)) {return 0;}Paint paint = new Paint();paint.setTextSize(textSize);paint.measureText(text);Paint.FontMetrics fontMetrics = paint.getFontMetrics();return fontMetrics.descent - fontMetrics.ascent;//返回值单位为px}
}

        效果图如下。

2.图形尺寸测量

        图形尺寸测量较为简单,因为Android提供了现成的方法获取宽高。如果图形格式为Bitmap则调用getWidth方法或者getHeight方法获取宽高。若是Drawable格式就通过方法getIntrinsicWidth以及方法getIntrinsicHeight获取宽高。

3.布局尺寸测量

        布局尺寸测量不同于上述两种尺寸,布局中可能有其他视图或者布局存在,而且还有padding与margin。逐个测量布局的内部控件是不现实的。View类提供了一种测量整体布局的思路,对应layout_width与layout_height的三种赋值方式,Android的视图基类同样提供了三种测量方式,具体说明如下表所示。

测量模式宽高赋值方式说明
AT_MOSTMATCH_PARENT达到最大
UNSPECIFIEDWRAP_CONTENT自适应
EXACTLY具体dp值精确尺寸

        围绕这三种方式衍生了相关的度量方法,如ViewGroup类的getChildMeasureSpec方法,用于获取下级视图的测量规格、MeasureSpec类的makeMeasureSpec方法,根据指定参数指定测量规格、View类的measure方法,按照测量规格进行测量操作等。下面以线性布局为例,示例代码如下。

    public float getLayoutHeight(View view){LinearLayout llayout = (LinearLayout) view;// 获得线性布局的布局参数ViewGroup.LayoutParams params = llayout.getLayoutParams();if (params == null) {params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);}// 获得布局参数里面的宽度规格int wdSpec = ViewGroup.getChildMeasureSpec(0, 0, params.width);int htSpec;if (params.height > 0) { // 高度大于0,说明这是明确的dp数值// 按照精确数值的情况计算高度规格htSpec = View.MeasureSpec.makeMeasureSpec(params.height, View.MeasureSpec.EXACTLY);} else { // MATCH_PARENT=-1,WRAP_CONTENT=-2,所以二者都进入该分支// 按照不确定的情况计算高度规则htSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);}llayout.measure(wdSpec, htSpec); // 重新丈量线性布局的宽高// 获得并返回线性布局丈量之后的高度。调用getMeasuredWidth方法可获得宽度return llayout.getMeasuredHeight();}

http://www.dtcms.com/a/512585.html

相关文章:

  • 中国平安网站建设成都网站建设易维达好
  • 继保:对于线路两侧的电流互感器型号系数选取
  • Redis分布式集群:从分区算法到扩容实战
  • AI大模型:(二)1.6 DeepSeek-OCR部署尝鲜
  • 在昇腾NPU上跑Llama大模型:从零开始的真实测试之旅
  • 直播类网站开发wordpress 图片自动分页
  • JADX下载和安装图解教程(附安装包)
  • 矽塔 SA8203 2.5A可调过流保护 输入耐压36V 过压/过流保护芯片
  • 网站开发饼图样式wordpress 如何登陆地址
  • 工业相机 “即插即用” vs 采集卡依赖
  • wordpress手机视频播放器免费seo营销软件
  • 【系统分析师】预测试卷一:论文及写作要点(包括对应素材和论文案例)
  • 私有云不私有?Nextcloud+cpolar让文件随身走
  • 诺基亚官方网站wordpress站点进入时弹窗
  • 网站建设运营合作合同外链代发工具
  • 重庆江北网站建设18款app软件免费下载百度
  • wordpress 多语言 站点动态ip做网站影响seo吗
  • 河南建设网站官网怎么用微信官方网站做二维码
  • JSTS ,JSXTSX的区别与联系(前端react第一篇)
  • 电子商务网站建设以什么为核心公司网站能自己做吗
  • 股指期货与股票的区别是什么?
  • 天津网站建设学习温州建站模板搭建
  • 兰州网站优化服务个性化网站建设费用
  • Nginx负载均衡:高性能流量调度指南
  • [人工智能-大模型-35]:模型层技术 - Transformer神经网络结构与其他类型的神经网络结构(CNN、RNN)的对比
  • Blender微细节纹理材质模型资产包 Micro-Details Premium Asset Pack
  • 解释Linux 系统中ls -l命令的输出
  • 重庆丰都建设局网站中国建设银行网站企业
  • 模拟到真实:使用OpenCV识别Xycar自动驾驶中的车道线和交通灯
  • wordpress论坛样式seo搜索引擎优化求职简历