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

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

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

1、创建projectCustomerTextView

例如以下图所看到的:

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(){}//又一次绘制样式@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stub}}

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

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

详细实现例如以下:

<?xml version="1.0" encoding="utf-8"?>    #EEF8E0A0    #EE0000FF    #EE0000FF    #AA0000FF

4、创建dimens.xml文件

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

详细实现例如以下:

    30dp

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()方法,让它像往常一样绘制文本。

详细实现代码例如以下:

//又一次绘制样式@Overrideprotected 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);//绘制margincanvas.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);}//又一次绘制样式@Overrideprotected 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);//绘制margincanvas.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"?>

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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.todolist_item);}@Overridepublic 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"?>                                                                                    

9、执行效果

Android之——自己定义TextView_第1张图片

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

更多相关文章

  1. 下载Android Sdk源码方法
  2. Android 自定义属性时TypedArray的使用方法
  3. Android TV 智能电视/盒子 APP 开发焦点控制 两种方法实例
  4. android v7包 正常导入使用方法
  5. Could not find *****/adb.exe!的解决方法(android sdk太新了?**#
  6. 转帖并消化:Android中一种使用AttributeSet自定义控件的方法
  7. Android Inflate()方法用途
  8. android语音识别方法一:使用intent调用语音识别程序

随机推荐

  1. android安全问题(七) 抢先接收广播 - 内因
  2. Android对话框的高级设置《一》设置对话
  3. Android(安卓)WebView 上传文件支持全解
  4. Android默认系统声音/大小修改及配置
  5. Android 使用基于位置的服务(二)
  6. 内存优化之其他优化(容器数据遍历方案,arra
  7. Android(安卓)m6.0权限问题调用封装utils
  8. android的apk文件的xml提取
  9. Android底部tab与标题栏相结合
  10. 你还在把Java当成Android官方开发语言吗?K