package study.com.defineview01demo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class Define01View extends View {
private Paint paint;
private int centerX;
private int centerY;
//new 控件的时候使用
public Define01View(Context context) {
this(context, null);
}
//在xml文件中使用
public Define01View(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
//在xml文件中引入样式使用时被调用
public Define01View(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
/**
* 相当于画画时准备画笔、颜料等阶段
*
* @param context
*/
private void init(Context context) {
//创建画笔
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
}
/**
* 用来测量画布的尺寸
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* 当确定好控件的尺寸之后,被调用。即在onMeasure方法完成之后调用onSizeChanged
*
* @param w
* @param h
* @param oldw
* @param oldh
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
centerX = w / 2;
centerY = h / 2;
}
/**
* 此方法相当于画家作画的过程
*
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//利用canvas提供的方法进行画圆
canvas.drawCircle(centerX, centerY, 100, paint);
}
}
直接继承现有的控件,那么该控件就拥有了父类控件的所有功能,同时也可以扩展出自己所需要的方法。这里就不进一步解释了,根据自己需求找到合适的控件进行继承和扩展即可。
从“ViewGroup”这个控件上就可以看出来,这类控件主要是用来充当View及其子类的容器。虽然ViewGroup也是View的子类,但是它在整个Android的控件体系中就是充当容器的作用。
自定义ViewGroup控件可以分为两种情况:直接继承ViewGroup来定义容器控件、继承现有容器控件(如:LinearLayout之类的容器控件)来定义容器控件
直接继承ViewGroup就相当于画家决定所要画的画的各个部分应该从画布的哪个位置开始起笔画。
package study.com.defineview01demo.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
import study.com.defineview01demo.R;
public class Define02ViewGroup extends ViewGroup {
private List srcList;
//new 控件的时候使用
public Define02ViewGroup(Context context) {
this(context, null);
}
//在xml文件中使用
public Define02ViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
//在xml文件中引入样式使用时被调用
public Define02ViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
/**
* 往容器中添加控件,自定
*
* @param context
*/
private void init(Context context) {
srcList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
ImageView imageView = new ImageView(context);
imageView.setBackgroundResource(R.mipmap.ic_launcher);
srcList.add(imageView);
//将控件添加至父布局中
addView(imageView);
}
}
/**
* 放置子控件,自定义容器的核心方法
*
* @param changed
* @param l
* @param t
* @param r
* @param b
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int size = srcList.size() / 2;
int childAt = 0;
for (int i = 1; i <= size; i++) {
for (int j = size; j >= i; j--) {
ImageView imageView = srcList.get(childAt);
imageView.setBackgroundResource(R.mipmap.ic_launcher);
//测量控件尺寸,下一篇文章中会详细说明
imageView.measure(0, 0);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
imageView.layout((j - i) * width, (i - 1) * height, (j - i + 1) * width, i * height);
childAt++;
}
}
}
}
直接继承现有容器控件,那么该容器就用了父容器控件的所有功能,同时也可以扩展出自己所需要的方法。这里就不进一步解释了,根据自己需求找到合适的控件进行继承和扩展即可。