流程:
为你的view在资源标签下定义自设的属性
在你的XML layout中指定属性值
在运行时获取属性值
把获取到的属性值应用在你的view上
示例:画一个简单的圆
step 1:为你的view在资源标签下定义自设的属性
在res/values/attrs.xml中定义属性:
<declare-styleable name="MyView">
<attr name="circieColor" format="color"/>
<attr name="circleRadius" format="integer"/>
</declare-styleable>
step 2: 在layout中指定属性
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<com.example.administrator.myapplication.MyView
android:id="@+id/myView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
custom:circieColor="#ff987324" //注:自定义属性的命名空间不同
custom:circleRadius="200"
/>
</RelativeLayout>
step 3:在运行时获取属性值
step 4 :把获取到的属性值应用在你的view上
package com.example.administrator.myapplication;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MyView extends View{
//自定义属性
private int circleColor;
private int circleRadius;
//圆的中心
private float xCenter=0,yCenter=0;
//画笔
private Paint paint;
//回调接口
private OnCircleClickListener mListener;
//回调接口
public interface OnCircleClickListener{
void circleClick(float x,float y);
};
//设置回调接口
public void setOnCirCleClickListener(OnCircleClickListener listener){
mListener = listener;
}
public MyView(Context context){
super(context);
init();
}
public MyView(Context context,AttributeSet attrs){
super(context,attrs);
TypedArray _typedArray = getContext().getTheme().obtainStyledAttributes(
attrs,
R.styleable.MyView,
0,0
);
try {
circleColor = _typedArray.getColor(R.styleable.MyView_circieColor, 0);
circleRadius = _typedArray.getInteger(R.styleable.MyView_circleRadius, 0);
}finally{
//回收资源
_typedArray.recycle();
}
init();
}
public void init(){
paint = new Paint();
if(circleColor != 0)
paint.setColor(circleColor);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//设置组件大小
setMeasuredDimension(circleRadius*2,circleRadius*2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(circleRadius != 0){
xCenter = circleRadius;
yCenter = circleRadius;
canvas.drawCircle(xCenter,yCenter,circleRadius,paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
paint.setColor(0xff765234);
mListener.circleClick(x,y);
break;
case MotionEvent.ACTION_UP:
paint.setColor(circleColor);
break;
}
//重画
invalidate();
return true;
}
}