转载请注明出处: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"?>
<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()方法,让它像往常一样绘制文本。

详细实现代码例如以下:

//又一次绘制样式@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"?>
<com.lyz.customer.textview.activity.ToListItemViewxmlns: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);<span style="color:#FF0000;">setContentView(R.layout.todolist_item);</span>}@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"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.lyz.customer.textview.activity"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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链接来下载完整的自己定义控件演示样例代码

Android之——自己定义TextView相关推荐

  1. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  2. android 使用xml定义自己的View

    android 使用xml定义自己的View 运行效果图: 主要activity: public class MainActivity extends Activity { @Override pro ...

  3. Android 第五章 TextView

    android:id="@+id/xx"控件标识.标签.ID android:layout_margin="10dp" 子控件与父控件之间距离10dp andr ...

  4. Android中实现为TextView添加多个可点击的文本

    这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...

  5. 使用android frame动画定义自己的ProgressBar

    使用android  frame动画定义自己的ProgressBar 在 res  /layout/ainm 目录下面建一个frame_ainm.xml文件 <?xml version=&quo ...

  6. android 多个textview,Android:多个textview像单个文本

    需要格式化几个textview像一个又一个独特的文本块,有没有办法实现这个?Android:多个textview像单个文本 这样 __________________________ | | | | ...

  7. android shape 无边框颜色,Android 使用shape定义不同控件的的颜色、背景色、边框色...

    Android 使用shape定义不同控件的的颜色.背景色.边框色 设置按钮的右边框和底边框颜色为红色,边框大小为3dp: 在drawable新建一个 buttonstyle.xml的文件,内容如下: ...

  8. android draw xml,Android使用XML定义渐变的drawable

    Android使用XML定义渐变的drawable Android,xml,drawable,渐变, 不是什么东西都需要美术来做图,利用Android提供的线程的东西,也能作出一下效果出来.当然比较负 ...

  9. android autolink识别错误,TextView autoLink=phone 在8.1机器上无效

    前言 某天,QA给我提了一个Bug,说是包裹物流追踪的电话不能自动识别了.正常情况如下图所示: 物流追踪 在8.1的机器上,TextView突然不能自动识别电话号码了. 1.电话号码识别 Androi ...

最新文章

  1. C语言图书管理系统注册功能,图书管理系统的c语言源程序
  2. 经验之谈|别再在CNN中使用Dropout了
  3. Cannot create a session after the response has been committed的处理
  4. map与weakmap,ES6 Map和WeakMap有什么区别?
  5. 双向链表中基本函数的实现
  6. php汉字组合算法,php数字转汉字的函数算法
  7. python怎么进阶_你真的会自学么?大佬整理的python进阶路径(长更)
  8. Selenium测试指南
  9. 7、python数据框重复值的查找和删除
  10. 海思移植 APR(Apache Portable Runtime)
  11. 打开html按钮没文字,为什么我打开网页有些字没显示但能点击
  12. 一位架构师用服务打动客户的故事之四
  13. Pillow透视变换进行图片纠偏
  14. 阿里达摩院数学竞赛新一轮考题曝光,李永乐老师曾给出第一题详细解答
  15. OrCAD Capture CIS 17.2导入Altium Designer原理图
  16. 泰州职称计算机考试电话,泰州市人事考试网
  17. 编程中python怎么读-Python 应该怎么学?
  18. Oracle Cloud Shell(甲骨文云Shell)+ FRP(反向代理)实现防火墙穿透,内网端口映,射公网
  19. 微型计算机及win7,不一样的微型电脑,加上win7系统,完美无击,还可以放口袋...
  20. Adversarial Camouflage: Hiding Physical-World Attacks with Natural Styles笔记

热门文章

  1. 中文数字转换为阿拉伯数字
  2. yyyy-mm-dd hh-mm--ss
  3. vs2010新功能(转)
  4. 文件传送,如此简单--ESFramework 4.0 快速上手(13)
  5. 河外动态:疑似UFO的编队在太阳附近徘徊
  6. linux中python进程,如何检查进程在python中运行(在linux中)?
  7. 08-08 性能测试--分布式
  8. avs3 ts格式封装 标准_第480期【软件】吊打格式工厂—高清视频转换器WonderFox HD Video便携版...
  9. python能开发android吗_python可以开发安卓吗
  10. 注意了,有关学习前端的一些“坑”,别踩!