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

来源:互联网 发布:winpe 网络组件 编辑:程序博客网 时间:2024/06/05 19:05

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

1 0
原创粉丝点击