Android非常开源,实现自定义View有很多种方法。继承View类就是其中之一。
继承View类需要实现构造函数super.()方法。其中super()方法有三个重载方法。分别是MyView(Context context)、MyView(Context context, AttributeSet attrs)和MyView(Context context, AttributeSet attrs, int defStyleAttr)。我们分别讲述一下三个重载方法的区别。
1、MyView(Context context)
该方法可以在MainActivity中直接使用。比如说mainActivity.setContentView(new MyView(this));但是不能在xml中使用。
2、MyView(Context context, AttributeSet attrs)
该方法可以让我们自定义的MyView类在xml中设置属性,比如说长、宽等。
3、MyView(Context context, AttributeSet attrs, int defStyleAttr)
该方法意味着MyView类不仅能在xml中设置属性,还能使用attrs.xml等资源文件。
做了一个简单的MyView例子:
我们新建MyView类:
package com.example.aiden.myapplication;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Aiden on 2016/3/11.
*/
public class MyView extends View implements View.OnClickListener {
private int time; // 记录点击的次数
private Paint paint; // 画笔
private Rect rect; // 矩形对象
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 设置画笔锯齿
this.rect = new Rect();
this.time = 0;
}
@Override
public void onDraw(Canvas canvas) {
// canvas相当于是画布,可以通过画笔在上面绘制
super.onDraw(canvas);
paint.setColor(Color.BLUE);
// 将这个View设置为矩形
canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint);
paint.setColor(Color.BLACK);
paint.setTextSize(300);
// 将内容绘制到rect对象上,用于得到长度和宽度
paint.getTextBounds(time + "", 0, (time + "").length(), rect);
// 画笔设置文字水平居中
paint.setTextAlign(Paint.Align.CENTER);
Paint.FontMetrics metrics = paint.getFontMetrics();
// 得到文字高度
float fontHeight = metrics.bottom - metrics.top;
// 得到垂直的位置
float y = this.getHeight() - (this.getHeight() - fontHeight) / 2 - metrics.bottom;
float x = this.getWidth() / 2;
canvas.drawText(time + "", x, y, paint);
this.setOnClickListener(this);
}
@Override
public void onClick(View v) {
time++;
// 刷新布局,相当于调用了onDraw(Canvas canvas)函数
this.invalidate();
}
}
在activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.example.aiden.myapplication.MyView
android:layout_width="200dp"
android:layout_height="200dp" />
</LinearLayout>
MainActivity中就没什么好写的了。就是this.setContentView(R.layout.activity_main);