在布局中引用一个自定义布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="zhoufenghui.exam.com.mycuserview.Main2Activity">
<zhoufenghui.exam.com.mycuserview.CustomView01//包名和类名必须写对
android:id="@+id/clock"
android:layout_height="match_parent"
android:layout_width="match_parent">
</zhoufenghui.exam.com.mycuserview.CustomView01>
</RelativeLayout>
在Mainactivity中引用原有布局.
public class Main2Activity extends AppCompatActivity {
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
自定义一个布局
public class CustomView01 extends View {
/**
* context: 上下文对象
* Button button = new Button(this);
* 必须要写的构造方法,目的是为了在java代码当中创建自定义view的对象
*/
public CustomView01(Context context) {
super(context);
}
/**
* attrs :自定义view在布局中定义的属性的集合。
* 如果自定义想要定义在布局当中,必须要定义这个构造方法。
*/
public CustomView01(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* defStyleAttr :默认的自定义的风格。
*/
public CustomView01(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* @des 绘制自定义view显示的内容
* Canvas :画布 确定了绘制的区域,提供了不同的绘制的方法,来完成绘制。
* Canvas在api当中的方法的分类:
* 1.绘制图片 :drawBitmap drawPicture
* 2.绘制颜色: drawColor drawARGB
* 3.绘制基本几何形状 : drawPoint,drawLine,drawCircle,drawArc,drawRect,drawOval,drawRoundRect
* 4.绘制剪切区: clipPath, clipRect,clipRegion,drawPath
* 5.变换Canvas :save,rotate,restore,translate,scale,
* 6.绘制顶点数据:drawVertices, drawBitmapMesh
*
* Paint :画笔
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画布的颜色
canvas.drawColor(Color.RED);
//定义画笔
Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setTextSize(80);
canvas.drawText("自定义view", 100, 200, paint);
paint.setColor(Color.BLUE);
//参数一二:起点的x,y轴坐标 ,参数三四:终点x,y坐标
canvas.drawLine(0, 0, 100, 200, paint);
canvas.drawCircle(100, 200, 50, paint);
}
/**
* 测量控件的长度和宽度
* widthMeasureSpec:父容器允许的最大的宽度
* heightMeasureSpec:父容器允许的最大的高度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/** View.MeasureSpec是view的静态内部类,反映了view的高度和宽度的尺寸和传入的测量方式。
* widthMeasureSpec和heightMeasureSpec表示他的对象的内容,内容包含了两个值:
*
* 测量方式分为三种:
* 1.AT_MOST :代表是不固定的值,根据内部的内容进行展示,通常定义为wrap_content会传入的模式。
* 2.EXACTLY :代表精确的值,当view的宽度或者高度被定义为match_parent或固定值时会传入的模式。
* 3.UNSPECIFIED :没有限制的,不固定的,通常是用于复杂控件如listview,gridview
* */
//获取宽度的测量模式
int wMode = MeasureSpec.getMode(widthMeasureSpec);
//获取高度的测量模式
int hMode = MeasureSpec.getMode(heightMeasureSpec);
//获取控件测量后宽高的最大尺寸
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
//判断xml文件当中传入的宽度的测量模式
switch (wMode) {
case MeasureSpec.AT_MOST:
wSize = 500;
break;
case MeasureSpec.EXACTLY:
wSize = 300;
break;
}
//判断xml文件当中传入的高度的测量模式
switch (hMode) {
case MeasureSpec.AT_MOST:
hSize = 500;
break;
case MeasureSpec.EXACTLY:
hSize = 400;
break;
}
Log.i("tag","自定义view的宽度:"+wSize+",高度:"+hSize);
//将计算出来的宽度和高度的值进行设置,从而确定自定义view的宽高
setMeasuredDimension(wSize,hSize);
}
}