一、简介
自定义View通常分为2类:自定义View和自定义ViewGroup
1、构造函数
为什么说到构造函数,因为不同的需求下我们所需要的构造函数是不同的:
public class CustomView extends View {
/**
* 当我们Java代码里面new的时候,会调用当前构造函数
*/
public CustomView(Context context) {
super(context);
}
/**
* 当我们在Layout中使用View的时候,会调用当前构造函数
*
* @param attrs XML属性(当从XML inflate的时候)
*/
public CustomView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
/**
* 当我们在Layout中使用View且使用Style属性的时候,会调用当前构造函数
*
* @param defStyleAttr 应用到View的默认风格(定义在主题中)
*/
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
2、坐标
Android坐标系与我们常见数据中的左边系不一样,即左正下正,如图下所示:
获取View位置
//获取View坐标
getLeft(); getTop();getBottom();getRight();
//onTouch中 触摸位置相对于在组件坐标系的坐标
event.getX(); event.getY();
//onTouch中 触摸位置相对于屏幕默认坐标系的坐标
event.getRawX(); event.getRawY();
3、自定义属性Attr
在自定义View时,我们经常使attr,如我们常常使用的android:layout_xxx
属性,就是定义attr在布局中使用的。自定义Attr流程如下:
-
res/values目录下新建一个attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="custom"> <attr name="title" format="string"/> <attr name="size" format="integer"/> </declare-styleable> </resources>
format表示了Attr的类型:reference:引用某一资源ID;fraction:百分数;flag:标记位,各个取值可用“|”连接;其他根据意思就可以理解了
-
使用自定义属性
加入命名空间xmlns:你自己定义的名称="http://schemas.android.com/apk/res/你程序的package包名"
,然后在布局中使用<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/com.example.active.loser.views .CustomView" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.active.loser.views.CustomView custom:title="cuson_title" custom:size="10" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
-
获取定义的Attrs的属性值
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //获取配置属性 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.custom, defStyleAttr, defStyleAttr); String title = a.getString(R.styleable.custom_title); int size = a.getInteger(R.styleable.custom_size, 20); //回收资源 a.recycle(); }
网友评论