Android自定义View的一般步骤
来源:互联网 发布:西蒙智力量表软件 编辑:程序博客网 时间:2024/04/30 11:07
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.EXACTLYint 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"/>
1 0
- Android自定义view的一般步骤
- Android自定义View的一般步骤
- Android实现自定义View的自定义属性的一般步骤
- Android自定义view的步骤
- android自定义view绘制的一般过程
- Android自定义控件一般步骤
- Android 自定义View步骤
- Android 自定义View步骤
- Android 自定义view步骤
- Android 自定义View步骤
- Android 自定义View 一般View定义
- 自定义View的步骤
- Android自定义View的基本步骤和使用自定义属性
- android自定义View实现步骤
- Android自定义view代码步骤
- android BoundService的一般步骤
- 自定义jsp标签的一般步骤
- AttributeSet 自定义控件的一般步骤
- HDU 3757 dp
- Java并发(三) ThreadLocal关键字
- 保护古文化遗产海报
- SQLSERVER2008服务无法启动
- Android——Matrix变换矩阵的探索(1)
- Android自定义View的一般步骤
- Android BroastCast的使用详解
- hdoj--3491--Thieves(最小割点集)
- Jboss5.1类加载及配置文件读取解密
- UESTC - 1045 Lovely princess (模拟)水
- 智能指针使用介绍
- 第十周周赛——周赛兼组队赛第二场题解(出自 BNUOJ28207,BNUOJ28201,BNUOJ28209,codeforces 667B,HDU 5439,HDU 5478)
- 实战案例:一台主机不能设置两个网关
- 剑指Offer-调整数组奇数位于偶数前面