Android之——自定义TextView

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47082241

在这一篇博文中,将向大家介绍如何以最简单的方式,来自定义Android中的控件,下面我们以自定义TextView为例来向大家介绍如何自定义Android中的控件。

首先,我们来简单说一下Android中自定义控件的原理:创建一个类,继承要自定义的控件类,重写父类的相关方法即可。原理说完了,是不是很简单呢?下面,我们就一起来自定义一个TextView控件吧。

1、创建工程CustomerTextView

如下图所示:

2、创建ToListItemView类

这个类扩展了TextView类,它包含一个重写的onDraw()方法,以及调用了新的init()方法的构造方法。

具体代码结构如下:

package com.lyz.customer.textview.activity;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * 自定义TextView类
 * 继承TextView类重写TextView的一些方法
 * @author liuyazhuang
 *
 */
public class ToListItemView extends TextView {
	/**
	 * 构造方法
	 * @param context
	 * @param attrs
	 * @param defStyle
	 */
	public ToListItemView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	/**
	 * 构造方法
	 * @param context
	 * @param attrs
	 */
	public ToListItemView(Context context, AttributeSet attrs){
		super(context, attrs);
		init();
	}

	/**
	 * 构造方法
	 * @param context
	 */
	public ToListItemView(Context context){
		super(context);
		init();
	}

	/**
	 * 初始化方法
	 */
	private void init(){
	}

	//重新绘制样式
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
	}
}

3、在res/values目录下新建colors.xml文件

在这个文件中,为页面,边缘,行和文本设置新的颜色值

具体实现如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="notepad_paper">#EEF8E0A0</color>
    <color name="notepad_lines">#EE0000FF</color>
    <color name="notepad_margin">#EE0000FF</color>
    <color name="notepad_text">#AA0000FF</color>
</resources>

4、创建dimens.xml文件

为页面边缘的宽度添加新值。

具体实现如下:

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
	<dimen name="notepad_margin">30dp</dimen>
</resources>

5、定制ToListItemView外观

创建新的私有实例变量来存储用来绘制页面的背景和边缘的Paint对象。此外,还要分别创建用来存储页面的颜色值和边缘宽度值的变量。

通过完善init()方法,来引用在前两步中创建的实例资源,并创建Paint对象

具体实现代码如下:

//绘制页面的背景
private Paint marginPaint;
//绘制页面的边缘
private Paint linePaint;
//存储页面的颜色值
private int paperColor;
//存储页面的边缘宽度值
private float margin;
/**
 * 初始化方法
 */
private void init(){
	//获得最资源表的引用
	Resources resources = getResources();
	//创建在onDraw方法中使用的画刷
	marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
	marginPaint.setColor(resources.getColor(R.color.notepad_margin));

	linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
	linePaint.setColor(resources.getColor(R.color.notepad_lines));

	//获得页面背景颜色和边缘宽度
	paperColor = resources.getColor(R.color.notepad_paper);
	margin = resources.getDimension(R.dimen.notepad_margin);
}

要开始绘制页面,就需要重写onDraw()方法。并使用前面创建的Paint对象来绘制图像,一旦绘制了页面图像之后,就可以调用父类的onDraw()方法,让它像往常一样绘制文本。

具体实现代码如下:

//重新绘制样式
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		//绘制页面的颜色
		canvas.drawColor(paperColor);
		//绘制边缘
		canvas.drawLine(margin, 0, margin, getMeasuredHeight(), linePaint);
		canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
		//绘制margin
		canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
		//移动文本,让它跨过边缘
		canvas.save();
		canvas.translate(margin, 0);
		//使用TextView渲染文本
		super.onDraw(canvas);
		canvas.restore();
	}

具体完整代码如下:

package com.lyz.customer.textview.activity;

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;

/**
 * 自定义TextView类
 * 继承TextView类重写TextView的一些方法
 * @author liuyazhuang
 *
 */
public class ToListItemView extends TextView {
	//绘制页面的背景
	private Paint marginPaint;
	//绘制页面的边缘
	private Paint linePaint;
	//存储页面的颜色值
	private int paperColor;
	//存储页面的边缘宽度值
	private float margin;
	/**
	 * 构造方法
	 * @param context
	 * @param attrs
	 * @param defStyle
	 */
	public ToListItemView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	/**
	 * 构造方法
	 * @param context
	 * @param attrs
	 */
	public ToListItemView(Context context, AttributeSet attrs){
		super(context, attrs);
		init();
	}

	/**
	 * 构造方法
	 * @param context
	 */
	public ToListItemView(Context context){
		super(context);
		init();
	}

	/**
	 * 初始化方法
	 */
	private void init(){
		//获得最资源表的引用
		Resources resources = getResources();
		//创建在onDraw方法中使用的画刷
		marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		marginPaint.setColor(resources.getColor(R.color.notepad_margin));

		linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		linePaint.setColor(resources.getColor(R.color.notepad_lines));

		//获得页面背景颜色和边缘宽度
		paperColor = resources.getColor(R.color.notepad_paper);
		margin = resources.getDimension(R.dimen.notepad_margin);
	}

	//重新绘制样式
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		//绘制页面的颜色
		canvas.drawColor(paperColor);
		//绘制边缘
		canvas.drawLine(margin, 0, margin, getMeasuredHeight(), linePaint);
		canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
		//绘制margin
		canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
		//移动文本,让它跨过边缘
		canvas.save();
		canvas.translate(margin, 0);
		//使用TextView渲染文本
		super.onDraw(canvas);
		canvas.restore();
	}
}

6、创建布局文件todolist_item.xml

这个文件引用的是我们自定义的控件类。

具体实现如下:

<?xml version="1.0" encoding="utf-8"?>
<com.lyz.customer.textview.activity.ToListItemView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:scrollbars="vertical"
    android:textColor="@color/notepad_text"
    android:fadingEdge="vertical"
    android:text="@string/hello_world"/>

7、完善MainActivity类

在MainActivity中设置我们自己定义的View

具体实现如下:

package com.lyz.customer.textview.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		<span style="color:#FF0000;">setContentView(R.layout.todolist_item);</span>
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

8、AndroidManifest.xml文件

最后,我们并没有在AndroidManifest.xml文件中做任何操作,AndroidManifest.xml文件中的内容都是自动生成的,下面我们还是给出AndroidManifest.xml文件中的代码吧

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lyz.customer.textview.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lyz.customer.textview.activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

9、运行效果

温馨提示:大家可以到http://download.csdn.net/detail/l1028386804/8936269链接来下载完整的自定义控件示例代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 07:49:44

Android之——自定义TextView的相关文章

Android中自定义TextView的样式

Android自定义TextView的样式,改变背景颜色,边框粗细和颜色,角的弧度等 在res/drawable文件夹下新建一个dd.xml文件,建一个shap,在里面添加需要改变的内容 <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ef0909"></solid>//设置背景色 <strok

自定义TextView使之具有跑马灯的效果

一.问题的引入 使用普通的textview跑马的效果,一开始没有焦点事件不会进行滚动,button有焦点事件,但是比较难看,因此需要自定一个TextView 一出生就有焦点 然后需要自定义一个textview FocusedTextView.java package com.xuliugen.mobilesafe.ui; import android.content.Context; import android.util.AttributeSet; import android.view.Vi

Android开发学习笔记-自定义TextView属性模版

如果项目中有很多个控件使用的是同一种样式,则为了方便,可以将样式设置到系统中去,这样使用的时候会方便很多. 下面是自定义样式模版的方法. 1.在style.xml文件中添加自己要设置的样式内容 <resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devic

android 自定义TextView&quot;会发脾气的TextView&quot;

转载请注明出处王亟亟的大牛路 Git上看到的一个自定义控件就搞来研究研究,蛮可爱的. 项目结构: 运行效果:很Q谈,谈的图片什么都 都可以换哦 自定义View: public class JelloToggle extends FrameLayout { private static final int DEFAULT_DURATION = 1000;//动画持续时间 private static final int UNCHECKED_JELLO_COLOR = 0xffadadad;//初始

Android 自定义TextView 实现文本间距

Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 但是有时候我们需要在TextView的文本之间有间距,两个字的话,我们可以在xml文件中,用敲空格的方式来实现,如果有很多文本或者是一个变量的文本呢.我们还这样用敲空格的方式来实现吗?oh no~! 如何实现行间距和文本间距呢?(请往下看 ↓). 1.设置TextView的

Android 自定义TextView实现文本内容自动调整字体大小以适应TextView的大小

最近做通讯录小屏机 联系人姓名显示--长度超过边界字体变小 /**   * 自定义TextView,文本内容自动调整字体大小以适应TextView的大小   * @author yzp   */   public class AutoFitTextView extends TextView {       private Paint mTextPaint;       private float mTextSize;          public AutoFitTextView(Context

自定义TextView实现微信动态的全文和收起功能

本示例实现微信朋友圈发布动态后呈现的全文和收起功能. 1,自定义TextView的布局文件——my_text_view.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- 自定义TextView,实现自动的添加全文和收起功能 --> 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)

我们知道,在很多时候,我们都不用Android内置的一些控件,而是自己自定义一些自己想要的控件,这样显得界面更美观. 今天主要是讲自定义AlertDialog和popupWindow的使用,在很多需求中,我们往往需要这样一个功能,就是点击一个按钮或者其它控件,弹出一个对话框,让用户可以在这个对话框中做一些事,比如输入.选择.提示.....等等,那么,这个弹出对话框的功能我们都知道可以用popupWindow和AlertDialog实现,的却,popupWindow被称为万能的,因为它的布局都是我

Android实现自定义字体

介绍 最近在看开源项目的时候,发现里面涉及到了自定义字体,虽然自己目前还用不到,但是动手demo笔记记录一下还是有必要的,没准哪天需要到这个功能. 原理 1.其实实现起来非常简单,主要是用到了Typeface这个类,通过加载assets里的ttf字体,调用View.setTypeface实现原生字体替换. 默认自带样式 public static final int NORMAL = 0; public static final int BOLD = 1; public static final