`
gryphone
  • 浏览: 433649 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

TextView 实现原理 实践

阅读更多

自定义View

 

[功能]

1. 自定义View 实现 TextView 的功能

2. 典型的 TextView 如下:

<TextView
			android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:text="HelloTextView" />

 

写道
android:text="HelloTextView"

 

就会显示指定的String

 

 

 

[代码]

1.  定义Text2View 所用关键字"text" 用于指定显示用的string

* 在 res/value 目录下创建 attrs.xml 文件 如下定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="Text2View">
        <attr name="text" format="string" />
    </declare-styleable>
</resources>

 

 

 

2. 定义 public class Text2View extends View

public class Text2View extends View {
    Paint text2Paint;
    String text2Text;
    int ascent;
    


    //Constructor - for java
    public Text2View(Context context) {
        super(context);
        initialize();
    }

    //Constructor - for xml
    public Text2View(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        initialize();

        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.Text2View);
        
        int n = ta.getIndexCount();
        
        for(int i =0;i < n;i++){
        	int attr = ta.getIndex(i); 
        	
        	switch(attr){
        	case R.styleable.Text2View_text:
        		updateText(ta.getString(R.styleable.Text2View_text));
        		break;
        		
        	//TO ADD CUSTOM ATTRIBUTE
        		
        	default:
        		break;
        	}
        	
        }
        
        ta.recycle();
    }
    
    private final void updateText(String s){
    	text2Text = s;
    	
    	requestLayout();
        invalidate();
    }
    
    //load default setting on Text2View
    private final void initialize() {
        text2Paint = new Paint();
        text2Paint.setAntiAlias(true);
        text2Paint.setTextSize(16);
        text2Paint.setColor(0xFF000000);
        //setPadding(3, 3, 3, 3);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec),
                measureHeight(heightMeasureSpec));
    }

    private int measureWidth(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            // Measure the text
            result = (int) text2Paint.measureText(text2Text) + getPaddingLeft()
                    + getPaddingRight();
            if (specMode == MeasureSpec.AT_MOST) {
                // Respect AT_MOST value if that was what is called for by measureSpec
                result = Math.min(result, specSize);
            }
        }

        return result;
    }

    /**
     * Determines the height of this view
     * @param measureSpec A measureSpec packed into an int
     * @return The height of the view, honoring constraints from measureSpec
     */
    private int measureHeight(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        ascent = (int) text2Paint.ascent();
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            // Measure the text (beware: ascent is a negative number)
            result = (int) (-ascent + text2Paint.descent()) + getPaddingTop()
                    + getPaddingBottom();
            if (specMode == MeasureSpec.AT_MOST) {
                // Respect AT_MOST value if that was what is called for by measureSpec
                result = Math.min(result, specSize);
            }
        }
        return result;
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawText(text2Text, getPaddingLeft(), getPaddingTop() - ascent, text2Paint);
        
    }
}

 

 

3. Text2View 构造函数需要解释一下:

//Constructor - for java
    public Text2View(Context context) {
        super(context);
        initialize();
    }

    //Constructor - for xml
    public Text2View(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        initialize();

        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.Text2View);
        
        int n = ta.getIndexCount();
        
        for(int i =0;i < n;i++){
        	int attr = ta.getIndex(i); 
        	
        	switch(attr){
        	case R.styleable.Text2View_text:
        		updateText(ta.getString(R.styleable.Text2View_text));
        		break;
        		
        	//TO ADD CUSTOM ATTRIBUTE
        		
        	default:
        		break;
        	}
        	
        }
        
        ta.recycle();
    }

 

 

4. 在 xml 文件中如何使用Text2View

<?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/com.android.View"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
<TextView
			android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:text="HelloTextView" />
<com.android.View.Text2View
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            app:text="HelloText2View" />
</LinearLayout>

 

 

 

5. 效果图 和默认的TextView 比较一下

分享到:
评论
14 楼 zhs2472 2011-01-11  
写得不错,能明白一些原理,期待楼主多写点这类的,加油
13 楼 luckwangjing 2011-01-10  
建议LZ下载android源代码!里面有详细的实现代码。
12 楼 kldwq2002 2011-01-10  
为什么不懂还装蛋的回复这么多呢?
11 楼 javetu_7 2010-07-28  
TextView上怎么显示光标?
10 楼 wjb_forward 2010-04-01  
哎呀,居然没看太懂,麻烦把源码发出来看看吧,最好把注释写详细点,谢谢
9 楼 yyw8316zpp 2010-03-29  
这方面的前辈们,俺是接触开发的新手,刚进公司,求这方面的发展,谁能给点资料,越基础越好。谢谢。
8 楼 yzhong_sa 2010-03-28  
对于做自己的ui确实有一些提示
7 楼 wjb_forward 2010-03-12  
写得很好,但是,能不能在关键的地方加点注释啊,看不大懂
6 楼 gryphone 2010-01-23  
melode11 写道
Lz实现个textView写那么长篇...不就是onMeasure和onDraw俩方法.

那你知道系统的TextView 实现的原理么? 这就是我写这个的本意!
5 楼 melode11 2010-01-22  
另外真想订制textView的外观,可以继承textView.重写onDraw
4 楼 melode11 2010-01-22  
Lz实现个textView写那么长篇...不就是onMeasure和onDraw俩方法.
3 楼 ansili 2010-01-21  
  很好,很强大。
最近急需这类知识。
2 楼 gryphone 2010-01-20  
yzhong_sa 写道
这个  意义何在?


定制化View啊 再作为模板
1 楼 yzhong_sa 2010-01-20  
这个  意义何在?

相关推荐

    自定义TextView实现垂直自动轮播

    本示例中,我们探讨的是如何自定义一个TextView来实现垂直自动轮播功能,这个控件名为`ScrollTextView`,它继承了`TextSwitcher`。`TextSwitcher`是一个用于在两个视图之间切换文本的视图,通常用于动画效果,而在...

    自定义TextView实现首行缩进

    在提供的"Textview_intent"文件中,可能包含了具体的代码示例或者更详细的实现步骤,你可以查看该文件以获取更多实践信息。在实际开发中,结合这些资料进行学习和实践,将有助于你更好地掌握自定义控件的技巧。

    使用TextView实现跑马灯效果

    这个项目中应该包含了具体的XML布局文件和Java代码示例,帮助你更好地理解跑马灯效果的工作原理和实现方式。在实际开发中,可以根据需求调整滚动速度、延迟时间等参数,以满足不同场景下的需求。

    TextView+Fragment实现底部导航栏

    在Android应用开发中,底部导航栏(Bottom Navigation)是一种常见的用户界面设计,它允许用户在应用的多个顶级视图之间快速切换。...通过实践这个示例,开发者可以深入理解Android中动态界面切换的原理和实践技巧。

    可收缩/扩展的TextView

    在Android开发中,TextView是用于显示文本的基本组件。...你可以参考这些代码,理解其实现原理,并根据项目的具体需求进行定制和优化。通过这样的实践,你将对Android UI组件的自定义和交互有更深入的理解。

    Android TextView闪闪发光特效

    在Android开发中,为UI元素添加动画效果可以极大地提升用户体验,"Android TextView闪闪发光特效...通过学习和实践`ShimmerDemo`和`ShimmerLibrary`,开发者可以深入理解这种特效的原理,并灵活运用到自己的项目中。

    安卓Android源码——textView1.rar

    对于Android源码的深入理解,掌握TextView的工作原理和内部机制对于优化UI性能、解决布局问题以及自定义控件开发具有重要意义。 在`textView1.rar`这个压缩包中,我们可能包含了对TextView类的源码分析或扩展。源码...

    展开收缩TextView

    在本篇文章中,我们将深入探讨如何实现这种效果,包括基本原理、实现方法以及一些优化技巧。 首先,我们要理解TextView的基本工作原理。TextView是Android系统提供的一个视图组件,用于显示单行或多行文本。默认...

    可拖动TextView

    通过这个简单实例,新手开发者可以了解到Android自定义控件的基本原理和实践过程,进一步提升开发技能。 至于压缩包中的"Android_DragButton"文件,可能是与这个教程相关的示例代码或者项目源码。如果你希望深入...

    安卓textView相关-TitanicforAndroidtextview的动态波浪形动画.rar

    总结来说,这个压缩包提供了一个在TextView上实现动态波浪形动画的实例,对于想要增强Android应用界面交互性的开发者来说,是一个宝贵的参考资料。通过深入研究和实践,可以提升在Android图形和动画领域的技能。

    Android-ExpandTextView-展开收起功能的TextView

    下面将详细讨论`ExpandTextView`的核心功能、实现原理以及如何在项目中应用。 1. **核心功能** `ExpandTextView`的主要功能是在有限的空间内展示过多的文本,提供一个简洁的方式让用户选择是否展开全部内容。默认...

    seekbar 动态移动带百分比TextView

    #### 一、`SeekBar` 与 `TextView` 的结合原理 在 `SeekBar` 上添加一个百分比显示的 `TextView` 主要涉及到以下几点: 1. **监听 `SeekBar` 的变化**:通过 `OnSeekBarChangeListener` 接口可以监听到 `SeekBar` ...

    自定义TextView

    自定义`TextView`是Android开发中的常见实践,它可以帮助开发者解决标准组件无法满足的需求,提高应用的用户体验。通过深入理解`TextView`的工作原理和Android图形绘制机制,我们可以创造出更多富有创意的UI元素。...

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

    在Android应用开发中,TextView是不可或缺的一个控件,它用于显示文本内容,广泛应用于各种界面元素,如标签、按钮、...通过学习和实践,开发者能更好地掌握在Android应用中如何有效利用TextView实现各种文本展示需求。

    Android定制控件:带图标有颜色TextView、可编辑文本框

    我们将深入讨论每个控件的实现原理,并提供相关的代码示例。 首先,我们来看带图标的TextView。在标准的Android TextView中,通常只能显示纯文本,但通过自定义控件,我们可以扩展其功能,使其能够显示图标和文本。...

    ExpandableTextView-实现一个具备展开折叠功能的TextView.zip

    首先,我们来看一下实现原理。在Android中,TextView是默认不可折叠的,因此我们需要对其进行扩展,创建一个新的自定义视图类。这个自定义视图继承自TextView,并添加了额外的功能来处理展开和折叠的逻辑。关键在于...

    Android手势研究(textview及listview对比验证)(二)

    本文将探讨在TextView和ListView这两种常见组件上实现手势检测的方法,并进行对比验证,以此来提升Android应用的交互性。我们将主要关注以下几个方面: 1. **手势识别基础**: 手势识别在Android中主要通过`...

    textView根据长度自动换行.zip

    源码学习可以帮助开发者深入理解TextView的工作原理。例如,查看`TextView`的`onMeasure()`方法,可以看到它是如何计算文本的尺寸并确定是否需要换行的。同时,`Layout`类的`calculateLineHeight()`和`...

    textview 小结

    **TextView 深度解析与应用实践** 在 Android 开发中,TextView 是最基础且重要的控件之一,它用于展示文本信息,支持多种格式和样式。这篇博客将深入探讨 TextView 的内部工作原理、常见功能以及如何通过源码理解...

    小程序源码 textView.zip

    通过分析"textView.zip"中的源码,我们可以学习到如何在小程序中使用和定制TextView组件,理解其工作原理,并且可以借鉴其中的实践技巧,提升自己的小程序开发能力。同时,也可以根据源码中的设计思路,进行二次开发...

Global site tag (gtag.js) - Google Analytics