我们在自定义控件的过程中,必须要考虑wrap_content和padding,为了提供便捷性,还需要对外提供自定义属性:
首先我们来添加自定义属性,在资源问价values中创建attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<decllare-styleable name="CircleView">
<attr name="circle_color" format="color"/>
</decllare-styleable>
</resources>
看看它的布局文件,在这里如果需要添加自定义的属性,那么我们就需要在跟布局加入这句话xmlns:app="http://schemas.android.com/apk/res-auto"这个是自定义属性的前缀也可以写成xmlns:app="http://schemas.android.com/apk/res/包名的形式"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.zidingyiview.MainActivity" >
<com.example.zidingyiview.view.CircleView
android:id="@+id/circleView1"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_margin="20dp"
android:background="#000000"
android:padding="20dp"
app:circle_color="@color/light_green" />
</RelativeLayout>
看看自定义布局文件
package com.example.zidingyiview.view;
import com.example.zidingyiview.R;
import com.example.zidingyiview.R.styleable;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
* 自定义圆
*
* @author admin
*
*/
public class CircleView extends View {
private int mColor = 0;
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CircleView(Context context) {
super(context);
init();
}
public CircleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.CircleView);
mColor = array.getColor(R.styleable.CircleView_circle_color,
Color.YELLOW);
array.recycle();
init();
}
private void init() {
paint.setColor(mColor);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthspecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthspecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightspecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightspecSize = MeasureSpec.getSize(heightMeasureSpec);
if (widthspecMode == MeasureSpec.AT_MOST
&& heightspecMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(200, 200);
} else if (widthspecMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(200, heightspecSize);
} else if (heightspecMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(widthspecSize, 200);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingRight();
final int paddingBottom = getPaddingBottom();
final int paddingTop = getPaddingTop();
int width = getWidth() - paddingLeft - paddingRight;
int height = getHeight() - paddingBottom - paddingTop;
int radius = Math.min(width, height) / 2;
canvas.drawCircle(paddingLeft + width / 2, paddingTop + height / 2,
radius, paint);
}
}
这里的自定义布局仅仅是自定义了一种属性,但是其他属性也是如此的,我们可以举一反三的进行编写,希望能帮到你。