安卓开发:继承View实现自定义View

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);

猜你喜欢

转载自blog.csdn.net/new_Aiden/article/details/50860785