`

对TextView的小探索

阅读更多

1、前言:

看了书上对于自定义组件的讲解,在看的测量view宽度和高度的时候,有点不理解,我们在写安卓的时候使用UI的时候习惯使用XML布局来定义控件,其实对view不太了解。总结一下刚才学习的吧,可能会有错误,首先是面向对象的思想,xml中的每个控件,肯定会转成视图对象,再看每个控件都定义了属性,所以在实例化的时候这个属性值都会被传入view对象当中。一个view要想被画在屏幕上,肯定最先需要知道要画多大,这个事情非常中要吧,其实就TextView而言,如果其中有字体也是可以计算出字体需要多宽和多高的。所以系统得到这些值是很容易的。借别人一个图片来看看吧:

2、先来看view的三个构造方法。

android开发者网站上有相关的说明文档:
public View (Context context)是在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个
public View (Context context, AttributeSet attrs)这个是在xml创建但是没有指定style的时候被调用
public View (Context context, AttributeSet attrs, int defStyle)这个不用说也懂了吧

 

3、我们先来看个子简单的自定TextView吧,当然是从TextView继承的:

package com.lmj.zidingyizujian;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

 public class XiugaiTextView extends TextView {
	//在ondraw方法中需要使用的画刷
	private Paint marginPaint;
	private Paint linePaint;
	private int pageColor;
	private float margin;
	
	
		
//覆写父类的构造方法,在view显示的时候,会调用这个方法,里面有上下文,和属性集合
	public XiugaiTextView(Context context, AttributeSet attrs, int defStyle) {
		//调用父类的构造方法,这样我们在标准中的使用的父类(TextView)的属性就可以生效了
		super(context, attrs, defStyle);
		//再调用我们自己方法,来修改一下界面
		init();
	}

	public XiugaiTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		//再调用我们自己方法,来修改一下界面
				init();
		
	}

	public XiugaiTextView(Context context) {
		super(context);
		
	}
	
	//对界面进行自己的修改
	public void init(){
		//获得系统资源的引用
		Resources res =    this.getResources();
		//对画刷进行赋值
		marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		marginPaint.setColor(res.getColor(R.color.xiugai_margin));
		linePaint  = new Paint(Paint.ANTI_ALIAS_FLAG);
		linePaint.setColor(res.getColor(R.color.xiugai_lines));
		
		//获得页面背景颜色和边缘宽度
		pageColor = res.getColor(R.color.xiugai_pager);
		margin = res.getDimension(R.dimen.xiugai_margin);
			
	}
	//覆写ondraw方法
	@Override
	protected void onDraw(Canvas canvas) {
		//就向ps中的图层
		
		//canvas的一些属性,其实在构造方法中已经进行了赋值,这里我们绘制背景,宽度会充满
		// 父容器,所以可以看出这个canvas画布的大小已经确定了。
		//绘制整个textview页面的颜色
		canvas.drawColor(pageColor);
		
		//绘制边缘
		canvas.drawLine(0,0,0, getMeasuredHeight(), linePaint);
		canvas.drawLine(0,  getMeasuredHeight(),getMeasuredWidth(), getMeasuredHeight(), linePaint);
		
		//绘制间隔线
		canvas.drawLine(margin,0, margin,getMeasuredHeight(), marginPaint);
		
		//移动文本,让textview上面的文本跨过分隔先
		
		canvas.translate(margin, 0);
		
		//使用textview渲染文本,父类的方法再次绘制,这个时候会绘制出textview上的的文本
		//界面上的最后一层
		//父类textview,只设置了文本,所以只会绘制出文本,其他上面都没有了。
		super.onDraw(canvas);
		 canvas.restore();
	}
	

}

 

 <com.lmj.zidingyizujian.XiugaiTextView
        android:id="@+id/xiugaiTextView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:textSize="20sp" />

 

颜色代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="xiugai_pager">#EEF8E0A0</color>
    <color name="xiugai_lines">#FF0000FF</color>
    <color name="xiugai_margin">#90FF0000</color>
    <color name="xiugai_text">#AA0000FF</color>
</resources>

 4、看完上面的代码,已经有点了解自定组件了。但是并不是就是重写ondraw那么简单

如果是自己直接继承view的话,就需要自己去规定大小了,于是探索了一下TextView的大小测定规律吧

 

当需要绘制view的整个大小的时候,或者需要多大空间的时候
父容器会询问子view需要多大,

做个试验,
在textview中,不设置内容,
设置高度大小为包裹内容,宽度设置也为包裹内容,背景为红色
这个时候其实没有内容,那么包裹内容,宽和高都是,理论上就是0,

试验结果:
这个时候确实没有任何内容

接着试验:
把宽度改为充满父容器,高度任然是包裹内容,背景为红色,
这个时候由于高度任然是0,对吧,因为没有内容,所以也不该显示

试验结果:有一条红色的线,
推理,试验一的时候,其实是有一个默认高度,默认高度不为0,但是模式宽度为0,
所以那个时候没有体现出高度,
简单说吧,如果第一次,两个值都是0,那么下一次,改变成一个0 和一个 1,
那么还是在界面上无法话出来的对吧,所以唯一的解释就是高度在包裹内容的时候
如果没有内容,那么在测量高度的时候会返回一个不为0的默认值,而宽度如果是0,那么测量的时

候返回的值也是0。

后话:我们在自定义的时候可以重写测量的方法,根据情况返回我们自己的测量大小
所以我猜测TextView 的高度的为0 的时候,返回的默认值不是0,或者至少当他的宽度
不为0的时候他的高度不为0.

 

  • 大小: 16.5 KB
0
0
分享到:
评论

相关推荐

    Android TextView的图片和文字居中探索

    总结来说,实现Android TextView的图片和文字居中涉及对TextView的自定义、内容测量以及绘制过程的控制。通过上述步骤,开发者可以创建出一个能够完美适应多种场景的居中TextView。在实际开发中,不断优化和调整,以...

    自定义TextView解决排版混乱

    在`onDraw()`方法中,我们可以使用`canvas.drawText()`方法来绘制文本,通过设置不同的坐标、颜色、字体等属性,实现对每一段文本的精确控制。如果需要处理复杂的文本样式,可以利用SpannableString或Spanned来分割...

    Android应用源码之4.TextView控件学习.zip

    本压缩包"Android应用源码之4.TextView控件学习.zip"包含了关于TextView深入学习的源码示例,非常适合开发者进行实践和探索。以下是对TextView控件的详细讲解: 1. **TextView基本使用** TextView是Android系统...

    自定义的TextView,简单学习自定义View

    通过继承TextView,我们可以对原有功能进行增强或添加新的特性。例如,我们可能希望添加特殊的文字效果、动画、触摸反馈等。这通常涉及到重写父类的方法,如`onDraw()`,在此方法中,我们可以使用Canvas对象绘制自己...

    android-TextView.rar_android_textview

    在Android开发中,TextView是用于显示单行或多行文本的基本组件。它在用户界面中扮演着重要的角色,不仅可以展示静态文本,还...通过不断探索和实践,开发者可以熟练掌握这些技巧,让TextView成为更加强大的交互工具。

    Android TextView中文字设置超链接、颜色、字体

    在Android开发中,TextView是用于显示文本的基本组件。在许多应用界面中,我们不仅需要展示普通的文本,还可能需要在文本中嵌入超链接,改变部分文字的颜色...在实际开发中,不断探索和实践,才能更好地掌握这些技巧。

    TextView属性详解

    ### TextView属性详解:深入探索Android高级编程中的文本控件配置 在Android开发中,`TextView`作为最基本的文本显示组件,其丰富的属性配置为开发者提供了极大的灵活性。本文将详细解析`TextView`的重要属性,帮助...

    安卓textView相关-TextView各种图文结合效果.rar

    总的来说,这个压缩包是学习和探索`TextView`在安卓中图文混排功能的好资源,通过研究和实践,开发者可以提升自己在UI设计和用户体验方面的技能,使得应用的界面更加丰富多彩。对于初学者,这是一个很好的实践平台,...

    自定义View入门---自定义一个TextView

    不断实践和探索,你会发现自定义View能为你的应用带来无限可能。 在"View02"压缩包文件中,可能包含有更详细的代码示例或者进一步的解释,你可以参考这些内容加深理解和实践。记得在实际项目中不断试验和优化,才能...

    ios-TextView~Placeholder.zip

    总之,`ios-TextView~Placeholder.zip`这个压缩包提供的资源可以帮助开发者理解并实现`UITextView`的占位符功能,同时也可以作为一个起点,进一步探索`UITextView`的各种高级特性和用法。通过学习和实践,开发者可以...

    安卓textView相关-ExpandableTextView打造可以下拉扩展的TextView.zip

    2. "JavaApk源码说明.txt":这可能是对源码的简要说明,包含了关于如何理解和使用源码的指导,对于开发者来说非常重要,因为它可以帮助理解代码的结构和设计思路。 3. "更多源码免费下载.url":这是一个URL链接,...

    android 垂直滚动的TextView

    接下来,我们可以探索一些进阶技巧。比如,有时候我们可能希望滚动速度可以调节,或者在文本达到顶部或底部时停止滚动。这时,可以使用`LinkMovementMethod`配合`SpannableString`实现: ```java SpannableString ...

    advanced-textview.zip

    【标题】"advanced-textview.zip" 是一个包含高级自定义TextView实现的压缩包资源,它提供了对Android系统默认TextView功能的扩展。这个压缩包可能是开发者为了分享或学习自定义UI控件而创建的,里面可能包含了多个...

    Android 学习(1)TextView

    2. **程序中获取TextView**:在Java代码中,我们可以通过findViewById方法找到布局中声明的TextView对象,然后对其进行操作。 ```java TextView textView = (TextView) findViewById(R.id.textView1); ``` **...

    TextView例程

    在Android开发中,`TextView` 是一个至关重要的组件,它用于显示单行或...通过探索和实践,还可以发现更多自定义`TextView`的方法,以满足特定的设计需求。记得在实际项目中,结合需求和用户体验,合理地运用这些技巧。

    Android源码——textView应用简单示例.zip

    在Android开发中,TextView是一个非常基础且重要的组件,它用于显示单行或多行文本。...对于初学者来说,这是一个很好的起点,而对于有经验的开发者,这可能是一个复习基础知识或探索新特性的机会。

    Android textView应用简单示例.rar

    在Android开发中,`TextView`是用于展示文本...在实际开发中,`TextView`还有更多功能等待开发者去探索和利用,比如对齐方式、行间距、字符间距等。通过熟练掌握这些知识点,可以构建更丰富、更具交互性的Android界面。

    Android学习笔记四:基本视图组件:TextView

    在Android开发中,基本视图组件是构建用户界面的基础元素,TextView作为其中之一,扮演着至关重要的角色。TextView用于展示文本信息,它不仅...在实践过程中,不断探索和学习,将使你成为一名更出色的Android开发者。

    Android 添加TextView删除线(代码简单)

    在Android开发中,有时我们需要对某些文本进行特殊样式处理,比如显示删除线,这通常用于表示某个价格或...希望这篇文章能帮助你理解和解决Android中添加TextView删除线的问题,同时也鼓励大家在实践中不断探索和学习。

    Android应用源码之4.TextView控件学习-IT计算机-毕业设计.zip

    在Android应用开发中,TextView控件是至关重要的组成部分,它用于显示文本,是用户界面(UI)中的基本元素。这份“Android应用源码之4....在实践中,不断探索和研究,将使你更深入地理解和运用这个关键的Android组件。

Global site tag (gtag.js) - Google Analytics