自定义控件开发流程及总结

原文地址http://blog.csdn.net/dinglin_87/article/details/7431545,原文有demo,但是原文没有代码格式,我把代码部分都重新放置了

本文只是简述自定义控件的步骤, 没有实现华丽的界面效果,仅供参考!自定控件步骤如下:

1、写一个类继承View或你想扩展功能的控件(比如TextView)。

 public class CustomView extends View { };

  

2、在/res/value下创建一个attr.xml文件。
没有这个文件自定义控件照样能显示出来,但只能使用所继承的父类中包含的属性,有了这个文件可以增加自定义的命名空间,来设置自定义的属性(其中format可选值见文尾)(大家看到这里可能觉得很突兀,坚持看完,相信你会明白这里的!)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomView">
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
    </declare-styleable>
</resources> 

2、CustomView中重写父类的构造方法(我一般把三个都写上)在构造方法中获取到自定义是属性的值。

public CustomView(Context context) {
super(context);
}

//xml文件解析的时候,会把标签解析成一个类,标签里的属性及属性值都传递到AttributeSet里了,所以我们要从这里把属性值获取出来,设置给画笔。

public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomView);//获取定义在attr中属性的属性值,这个属性值是在,把控件设置到界面上时所使用的layout中设置的
int color = array.getColor(R.styleable.CustomView_textColor, Color.RED);//第二个参数为默认值
float size = array.getDimension(R.styleable.CustomView_textSize, 10);

paint = new Paint();
paint.setColor(color);
paint.setTextSize(size);

array.recycle();//必须有!!清空原array,防止以后出现原来设置的属性。
}

4、重写onDraw()方法。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("我是被画出来的", 10, 100, paint);//第二个和第三个参数为坐标的X轴Y轴
}

5、新建一个Activity(此处不再给出),在其使用的布局文件中添加自定义控件,并且可以引入自定义的命名空间,使用attr中定义的属性。

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dinglin="http://schemas.android.com/apk/res/cn.itheima.customview"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:orientation="vertical" >

    <!-- 使用自定义控件要用包名+类名的形式,其中命名控件dl中可以使用在attr.xml中定义的属性 -->
      <cn.itheima.customview.CustomView
        android:layout_width="fill_parent"
         android:layout_height="fill_parent"
        dl:textColor="#ff00ff00"
       dl:textSize="25dip" >
    </cn.itheima.customview.CustomView>
</LinearLayout>

搞定!运行就可以看到自己定义的控件了,这个控件有些丑,文章开头已经说了,只是简单介绍自定义控件的开发流程!勿怪!

------------------------------------------------------

附:attrs.xml中format属性可选值!此部分资料来源http://blog.sina.com.cn/s/blog_61f4999d010110o8.html
Android自定义属性时format选项可以取用的值
1. reference:参考某一资源ID。
(1)属性定义:

<declare-styleable name="名称">
<attr format="reference" name="background" />
</declare-styleable>

(2)属性使用:

<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID" />

2. color:颜色值。
(1)属性定义:

<declare-styleable name="名称">
<attr format="color" name="textColor" />
</declare-styleable>

(2)属性使用:

<TextView
android:layout_width="42dip"
android:layout_height="42dip"
android:textColor="#00FF00" />

3. boolean:布尔值。
(1)属性定义:

<declare-styleable name="名称">
<attr format="boolean" name="focusable" />
</declare-styleable>

(2)属性使用:

<Button
android:layout_width="42dip"
android:layout_height="42dip"
android:focusable="true" />

4. dimension:尺寸值。
(1)属性定义:

<declare-styleable name="名称">
<attr format="dimension" name="layout_width" />
</declare-styleable>

(2)属性使用:

<Button
android:layout_width="42dip"
android:layout_height="42dip" />

5. float:浮点值。
(1)属性定义:

<declare-styleable name="AlphaAnimation">
<attr format="float" name="fromAlpha" />
<attr format="float" name="toAlpha" />
</declare-styleable>

(2)属性使用:

<alpha
android:fromAlpha="1.0"
android:toAlpha="0.7" />

6. integer:整型值。
(1)属性定义:

<declare-styleable name="AnimatedRotateDrawable">
<attr format="integer" name="frameDuration" />
<attr format="integer" name="framesCount" />
</declare-styleable>

(2)属性使用:

[html] view plaincopyprint?
<animated-rotate
android:frameDuration="100"
android:framesCount="12"/>

7. string:字符串。
(1)属性定义:

<declare-styleable name="MapView">
<attr format="string" name="apiKey" />
</declare-styleable>

(2)属性使用:

<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />

8. fraction:百分数。
(1)属性定义:

<declare-styleable name="RotateDrawable">
<attr format="fraction" name="pivotX" />
<attr format="fraction" name="pivotY" />
</declare-styleable>

(2)属性使用:

<rotate
android:pivotX="200%"
android:pivotY="300%"/>

9. enum:枚举值。
(1)属性定义:

<declare-styleable name="名称">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>

(2)属性使用:

<LinearLayout
android:orientation="vertical" >
</LinearLayout>

10. flag:位或运算。
(1)属性定义:

<declare-styleable name="名称">
<attr name="windowSoftInputMode">
<flag name="stateUnspecified" value="0" />
<flag name="stateUnchanged" value="1" />
<flag name="stateHidden" value="2" />
<flag name="stateAlwaysHidden" value="3" />
<flag name="stateVisible" value="4" />
<flag name="stateAlwaysVisible" value="5" />
<flag name="adjustUnspecified" value="0x00" />
<flag name="adjustResize" value="0x10" />
<flag name="adjustPan" value="0x20" />
<flag name="adjustNothing" value="0x30" />
</attr>
</declare-styleable>

(2)属性使用:

<activity
android:windowSoftInputMode="stateUnspecified | stateUnchanged | stateHidden" >
</activity> 

注意:属性定义时可以指定多种类型值:
(1)属性定义:

<declare-styleable name="名称">
<attr format="reference|color" name="background" />
</declare-styleable>

(2)属性使用:

<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/图片ID|#00FF00" />
时间: 2024-08-09 05:01:39

自定义控件开发流程及总结的相关文章

Android 自定义控件开发入门 (三)

上两次我们从如何自定义控件讲起,列举了View的一些Api,说明了一些在自定义的时候,可以进行重写的方法,然后通过一个例子的两种写法向大家展示了最基本的自定义控件和我们要充分了解并积极重写View方法的精神,这次我们将继续进行学习! 现在请大家回想一下我们使用安卓原生控件时的感受,一个好的控件是可以在xml中进行各种属性的操作的,而自定义控件往往有一些特殊的需求,今天我要讲的就是安卓给自定义控件添加自定义的属性. 下面再给大家具体介绍一下如果自定义的View需要有自定义的属性我们该如何处理: 我

基于微信硬件公众平台的智能控制开发流程

一.微信硬件公众平台整体架构 上一篇<物联网架构场景技术分析>已经探讨和分析了物联网架构的演进,基于微信硬件公众平台的智能控制方案即属于文中的第三种架构--基于统一后台服务的物联架构.其中的架构如下: 各部分的角色和分工如下: 1.微信硬件公众号平台服务器,是物联网的基础和核心部分,其负责外设设备ID的认证,类似公安部给每个公民一个身份证一样,保证每个外设都有一个合法并且唯一的ID.目前微信平台的设备ID由两部分组成,一部分是厂商运维的公众号(即手机微信关注的公众号)的原始ID,称为设备类型,

EAM系统开发流程

EAM系统开发流程主要包括三个阶段: EAM系统分析 主要是通过规范EAM系统内的信息,进一步把它们整合成一个完整的EAM原型.具体的工作是定义EAM系统中的词汇和建立一组用来生成具有可重用和可配置的概念模型的规范.这些对实施具体系统有指导作用,并且是其基础,类似施工手册.例如,对于资产可以定义为一个能跟踪.修复后可重复使用的.唯一具有独立名称的实体.  EAM系统设计 主要是开发一个高度灵活的通用架构,并且提供一个生产规范.软件构架为组件或对象的重组和配置提供了技术保证,为实现系统的灵活通用提

微信支付的开发流程

最近在公司做了微信支付的接入,这里总结下开发的一些经验 注意,我使用的是微信开放平台的支付,与手机app相关,而与公众账号无关.   微信支付的主要操作流程 1.用户浏览app,选定商品然后下单. 2.服务器处理订单逻辑,开始正式发起支付流程 3.首先,后台服务器向weixin服务器发起请求,获取一个token. 4.后台服务器拿到token,使用和其他参数加密,再次向weixin服务器发起请求,获取一个预支付prepayid 5.后台服务器将该prepayid返回给app客户端 6.app调用

互联网公司的“敏捷开发”流程是怎么样的,每个职位的角色和分工是什么?

作者:暗灭 第一   为什么需要敏捷开发. 在几万年以前,软件项目的开发都是以年来计算的,这代表什么意思呢 ?需求设计了半年多,方案设计做了半年多,开发了三年多,测试了半年多,修改Bug用了半年多.总计花了很长很长的时间,然后上线后发现有很多需求已经不存在了,同时又出现了很多新的需求. 怎么办?继续改.这一改又是半年多的时间过去了.马丹用户的需求还再改,怎么办? 这是困扰软件开发项目的最大的问题,越大的项目,参与的人越多,风险越大.文档越规范,维护起来的难度就越高,导致项目中遇到的问题越来越多.

oAuth的认知以及开发流程

什么是OAUTH OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的.oAuth是Open Authorization的简写. OAUTH定义 OAUTH是一种开放的协议,为桌面.手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务.OAUTH类似于Flickr Auth.Go

Hibernate开发流程

一:基本开发流程: -->导入jar包,hibernate.jar + required + jpa + 数据库驱动包 -->对实体类进行映射,写配置文件 -->src目录下添加hibernate.cfg.xml文件 数据库相关配置,其他相关配置(是否显示sql,是否自动建表等),映射文件加载 -->测试DAO 二:hibernate程序执行流程 三:hibernate.cfg.xml配置详解 1 <!DOCTYPE hibernate-configuration PUBLI

开发流程的选择

软件工程把这些相关的技术和过程统一到一个体系中,叫作"软件开发流程",软件开发流程的目的是为了提高软件开发.运营和维护的效率,以及提升用户满意度.软件可靠性和可维护性. 软件开发流程有:写了再改模式.瀑布模型.瀑布模型的各种变形.统一流程.老板驱动的流程和渐进交付的流程. 在这些开发流程中,我比较支持瀑布模型的各种变形中的大瀑布带着小瀑布,这个对开发者的个人能力要求比较高,需要吧各个子系统统一到最后做系统测试,用户只有到最后才能看到结果,从一开始的需要一个统一的需求分析和构架设计,然后

聚合数据简易开发流程

聚合数据SDK简介 聚合数据SDK是一套基于Android/iOS开发的程序接口,目前已有Android.iOS版本.开发者可以使用该套SDK开发适用于Android/iOS系统移动设备的应用,通过调用SDK接口,可以轻松的访问聚合的所有数据和服务,构建功能丰富.交互性强的应用程序该SDK集成了平台上的大部分数据服务(除电商SDK.比价SDK.定位SDK外),开发者只需使用聚合SDK即可调用已经申请的数据,无需再针对不同数据编写程序,更方便用户快速开发. Android SDK V2.0 简易开