Android自定义View的一般步骤

1、设置当前View自定义属性

需要在res的values文件夹下新建个attrs文件,在attrs文件中设置相关的自定义属性
设置自定义属性的名称
<!-- format属性可以用来限制当前自定义的属性是什么类型,
    中间可以用 | 来连接,表示可以支持多种类型 -->
<attr name="user_defined_attribute" format="color" />
<!-- 可以指定枚举类型,用来自定义一些需要用户选择的属性,
    比如android系统中的android:visibility属性 -->
<attr name="user_defined_attribute1" format="enum">
    <enum name="type_0" value="0" />
    <enum name="type_1" value="1" />
</attr>  

定义这些属性所属于的 declare-styleable

<declare-styleable name="MyViewStyleable">
    <attr name = "user_defined_attribute"/>
    <attr name = "user_defined_attribute1"/>
</declare-styleable>  

2、继承相关的view,在构造方法中获取相关的属性

自定义view通常优先考虑系统有没有合适的view来使用,如果有的话应该先继承系统已有的view进行扩展,如果系统没有类似的View在自定义对应的View

    public CustomVolumControlBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.getTheme().
                obtainStyledAttributes(attrs, R.styleable. MyViewStyleable,
                defStyleAttr, 0);
        int n = a.getIndexCount();
        for (int i = 0; i < n; i++) {
            int index = a.getIndex(i);
            switch (index) {
            case R.styleable. MyViewStyleable_user_defined_attribute:
                mAttribute = a.getInt(index, 20);
                break;
            case R.styleable. MyViewStyleable_user_defined_attribute1:
                mAttribute1= a.getInt(index, 0);
                break;
            }
        }
        a.recycle();
    }  

同时构造方法一般还会负责进行一些画笔的初始化等工作。

3、在onMeasure(或onSizeChange)方法中为属性赋值

这里一般用来确定当前view的宽高,并根据宽高等计算一些坐标默认的值。

通常这里会用到如下的一些代码:


//获取当前的模式
/**
 * MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求
 * MeasureSpec由size和mode组成。
 * 三种Mode:
 * 1.UNSPECIFIED
 * 父不没有对子施加任何约束,子可以是任意大小(也就是未指定)
 * 没有设置宽高时,模式为UNSPECIFIED
 * 2.EXACTLY
 * 父决定子的确切大小,子被限定在给定的边界里,忽略本身想要的大小。
 * (当设置width或height为match_parent时,模式为EXACTLY,因为
 * 子view会占据剩余容器的空间,所以它大小是确定的)
 * 3.AT_MOST
 * 子最大可以达到的指定大小
 * (当设置为wrap_content时,模式为AT_MOST, 表示子view的大小最多是多少,
 * 这样子view会根据这个上限来设置自己的尺寸)
 *
 * MeasureSpecs使用了二进制去减少对象的分配。
 */
//可以简单理解为:
//wrap_parent -> MeasureSpec.AT_MOST
//match_parent -> MeasureSpec.EXACTLY
//具体值 -> MeasureSpec.EXACTLY
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
//获取当前的高度
int heightSize= MeasureSpec.getSize(heightMeasureSpec);
// 根据所传的值大小和模式创建一个合适的值
heightMeasureSpec = MeasureSpec.makeMeasureSpec(exceptHeight, MeasureSpec.EXACTLY);
//重新设置宽高
setMeasuredDimension(wght, wght);

4、在onDraw方法中绘制相关的自定义view

此处需要获取到当前的画布,然后用对应的画笔进行相关的绘制操作。通常会涉及到如下方法

//用来保存Canvas的状态save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作
canvas.save();
//用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响
canvas.restore();
//save和restore要配对使用(restore可以比save少,但不能多),
//如果restore调用次数比save多,会引发Error
//上面两个方法结合使用可以相当于把画布分成多个图层进行绘制,各个图层间互不影响

//移动坐标原点到指定位置
ccanvas.translate(x,y);
//对画布旋转指定的角度
canvas.rotate(30);  

即使再复杂的View也是用Paint一次次绘制得出的。所以只要慢慢的调整画笔,调整颜色,一个好的自定义view就会出现的。

5、重写onTouchEvent方法(手势控制相关)

一般用来检测一些首饰相关的操作,用来和用户进行交互。设计思路通常如下:

1.获取用户当前的点击(触摸、抬起)坐标

2.用单前坐标和绘制好的View进行比较

3.根据预先设置的逻辑,然后在对应的位置执行相关的操作。(如重绘或移动等)

6、在xml文件中使用

1.全路径名引用自定义控件

2.在自定义控件中引入自定义属性

如下列代码所示:

<com.test.myview.view.MyTestView
    <!-- hwy为引用时使用的名字,可以随意,res后面为AndroidManifest中的包名,
    这行引用也可以在根布局中引入 -->
    xmlns:hwy="http://schemas.android.com/apk/res/com.test.myview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    hwy: user_defined_attribute="#ffffffff"
    hwy: user_defined_attribute1="type_1"/>  
时间: 2024-10-24 01:14:44

Android自定义View的一般步骤的相关文章

[原] Android 自定义View步骤

例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能够有效地使用CPU和内存,并且十分开放的.但是,除了开始一个设计良好的类之外,一个自定义view应该: l 符合安卓标准 l 提供能够在Android XML布局中工作的自定义样式属性 l 发送可访问的事件 l 与多个Android平台兼容. Android框架提供了一套基本的类和XML标签来帮您创

(转)[原] Android 自定义View 密码框 例子

遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 样子 支持的样式 可以通过XML定义影响外边和行为的属性如下 边框圆角值,边框颜色,分割线颜色,边框宽度,密码长度,密码大小,密码颜色 <declare-styleable name="PasswordInputView"> <attr name="border

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

android 自定义View【2】对话框取色&amp;色盘取色的实现

android 自定义View[2]对话框取色&色盘取色的实现    上一篇文章基本介绍了android自定义view的流程:继承view,复写view的一些方法.实现简单的自定义view.这篇文章主要介绍的是系统对话框取色功能,然后顺便介绍升级版,色盘取色[类似于ps中的吸管,对图片点击相应位置,获取那个位置的颜色]. 一.概述:通过该例子了解以下内容: 1.进一步了解android 自定义view. 2.知道如何获取图片上的颜色值. 3.监听屏幕touch,实现移动的时候自动取色.[onDr

Android自定义View(二、深入解析自定义属性)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51468648 本文出自:[openXu的博客] 目录: 为什么要自定义属性 怎样自定义属性 属性值的类型format 类中获取属性值 Attributeset和TypedArray以及declare-styleable ??在上一篇博客<Android自定义View(一.初体验)>中我们体验了自定义控件的基本流程: 继承View,覆盖构造方法 自定义属性 重写onMeasure方法测量宽

[原] Android 自定义View 密码框 例子

遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 样子 支持的样式 可以通过XML定义影响外边和行为的属性如下 边框圆角值,边框颜色,分割线颜色,边框宽度,密码长度,密码大小,密码颜色 <declare-styleable name="PasswordInputView"> <attr name="border

android 自定义View过程解析

PS:本篇文章大多数翻译自github上一篇英文文章! 总所周知,安卓UI是基于View(屏幕上的单一节点)和ViewGroup(屏幕上节点的集合),在android中有很多widgets和layouts可以用于创建UI界面,比如最常见的View有Button,TextView等等,而最常见的布局也有RelativeLayout,LinearLayout等. 在一些应用中我们不得不自定义View去满足我们的需求,自定义View可以继承一个View或者已存在的子类去创建我们自己的自定义View,甚

我的Android进阶之旅------&gt;Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢daimajia的开源奉献! 第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/deta

Android自定义View(RollWeekView-炫酷的星期日期选择控件)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义CustomWeekView 4重写onMeasure 5点击后执行动画 7重置预备控件 源码下载 ??最近收到一个自定义控件的需求,需要做一个日期选择控件,实现图如下: ???? ??一次展示一个星期的5天,中间放大的为当前选中的:如果点击了其中一个日期,比如星期五,那么整体向左滑动,并将星期五慢慢放大