我一直觉得自定义View比较难实现,之前也看过一些别人的代码和介绍
今天就自己尝试着写了一段
首先 我们要写一个Class类文件继承 view,并且实现构造方法;
public CostomView(Context context) { super(context); } public CostomView(Context context, AttributeSet attrs) { super(context, attrs); }
对于自定义View,我们可以设置一些属性,通过构造方法加载
在res文件夹下的values文件夹中建立名为“attrs”的xml文件,在该文件里我们设置自定义view需要用到的属性
<!--声明我们的属性,名字为CostomView-->
<declare-styleable name="CostomView"> <!--声明我们的属性,名称为color,取值类型为color--> <attr name="color" format="color"/> </declare-styleable>接下来,我们就需要在构造方法中将属性引入:
public CostomView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.CostomView); color=a.getColor(R.styleable.CostomView_color, Color.BLACK); LogUtils.ytf("构造方法"); a.recycle();//一定要调用 }这样,我们就可以在布局文件中设置颜色值;
接下来,要实现测量的方法:onMeasure()
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重写测量方法 super.onMeasure(widthMeasureSpec, heightMeasureSpec); }这里要着重说一下 widthMeasureSpec和heightMeasureSpec,这两个参数分别带有两项信息,即模式和大小;
模式有三种,可以自行百度;
代码:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//重写测量方法 super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width=getMySize(100,widthMeasureSpec); int height=getMySize(100,heightMeasureSpec); LogUtils.ytf("onMeasure"+width+";"+height); setMeasuredDimension(width,height);//设置控件的宽高 } public int getMySize(int defaultSize,int measure){ int MySize=defaultSize; int mode=MeasureSpec.getMode(measure); int size=MeasureSpec.getSize(measure); switch (mode){ case MeasureSpec.AT_MOST: MySize=size; break; case MeasureSpec.EXACTLY: MySize=size; break; case MeasureSpec.UNSPECIFIED: MySize=defaultSize; break; } return MySize; }设置完控件的宽高之后,最重要的一步就是把它画出来:onDraw
@Override protected void onDraw(Canvas canvas) {//画出自定义VIew super.onDraw(canvas); LogUtils.ytf("onDraw"); //定义一直画笔 Paint mPaint=new Paint(); mPaint.setColor(color); int r=getMeasuredWidth()/2; int fx=getLeft()+r; int fy=getTop()+r; canvas.drawCircle(fx,fy,r,mPaint);//在画布上画出来 }
到这 一个圆形的自定义view就已经实现了
我们可以在布局文件中使用
<com.example.administrator.text.View.CostomView android:layout_width="100dp" android:layout_height="100dp" ytf:color="#ff45dd" />