转载请注明出处: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(){
} //又一次绘制样式
@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、执行效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="390" width="558">

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

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

  1. 它们的定义TextView使之具有跑马灯的效果

    一.引入问题 使用通用textview快乐效应,焦点事件不启动滚动,button目前的焦点事件,但丑,因此,需要定制TextView 天生焦点 个textview FocusedTextView.ja ...

  2. Android用户界面 UI组件--TextView及其子类(五) DigitalClock,AnalogClock,RadioButton,CheckBox,ToggleButton汇总

    DigitalClock和AnalogClock两个时钟类 可以为DigitalClock设置背景图片,自定义时针,秒针,分针的样式 例子: <?xml version="1.0&qu ...

  3. Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置

    Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置 2013年8月14日Android记录 很多应用都会有用户设置,用户的一些偏好可以由用户来决定 ...

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

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

  5. 自己定义TextView 调用ttf格式字体

    方法一:自己定义TextView 调用ttf格式字体 <strong>将ttf格式文件存放在assets/fonts/下</strong> 注:PC系统字体存放在C:\Wind ...

  6. Android UI 设计之 TextView EditText 组件属性方法最详细解析

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

  7. android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度

    android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度 1.获取自己定义控件height 在本Activity中获取当前Activity中控件的height: Button button ...

  8. Android基础控件TextView

    1.常用属性 <TextView android:id="@+id/text11" //组件id android:layout_width="match_paren ...

  9. Android之垂直显示TextView

    Android之垂直显示TextView 1因为界面需求原因,需要TextView垂直显示,话不多说,看代码,我也是搜的例子,在此感谢写这个例子的大神,在此做个笔记和分享给大家 2.用到了自定义控件的 ...

随机推荐

  1. UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675">点击打开链接 gg.. ...

  2. HDU 1160 FatMouse&#39;s Speed DP题解

    本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,只是由于须要按原来的标号输出,故此须要使用struct把三个信息打包起来. 查找最长递增子序列使用动态规划法.主要的一维动态规划法了. 记录 ...

  3. vue中 router-link 传递参数以及获取

    将所遇见的问题一步一步记录下来,不久便会成长 今天在修改前端(vue) BUG的时候遇见 router-link标签,传递参数到另一个页面,确不知道参数在另一个页面怎么接收,于是找度娘需求解决办法,最 ...

  4. Jmeter执行多条Mysql语句报错

    花了很长时间找原因,Jmeter一直返回的是MySql语法错误,就写了两条很简单的删除语句,并且在MySql里可以正常执行 包括换了jdbc驱动包,更改不同的Query Type等 后来发现两条语句拆 ...

  5. js前台编码,asp.net后台解码 防止前台传值到后台为乱码

    js编码:     encodeURI() 后台解码:HttpUtility.UrlDecode()

  6. SQL Server数据库性能优化

      开篇:    最近遇到了很多性能问题,一直没来的及总结,今天正好周末抽时间总结下: 对于稍微大点的公司或者说用户多一些的公司,说白了就是数据量较大的公司,在查询数据时往往会遇到很多瓶颈.这时就需要 ...

  7. GIT 常用方法

    代码提交顺序: conmmit(提交代码到本地仓库)   --->>>   pull(将本地仓库代码合并)  ---->>>   push(将本地合并后的代码提交到 ...

  8. art-template模板渲染及其过滤器

    原生语法 使用原生语法,需要导入template-native.js文件.在HTML中定义模板,注意模板的位置,不要放到被渲染区域,防止模板丢失. <script id="tpl&qu ...

  9. 关于app夜间模式那点事

    大半年没写过代码了 一直在忙一些其他的事情  这几天想起来看了一点  心惊肉跳的 发现好陌生  所以打算今后慢慢的拾起来  往深度和广度去发展 发现好久之前写的一个微博项目  有一个夜间模式的功能没有 ...

  10. mysql安装出现 conflicts with mysql*的解决办法

    rpm -ivh Percona-Server-client-56-5.6.16-rel64.0.el6.x86_64.rpm --nodeps --force error: Failed depen ...