android零基础入门第二季,Android零基础入门第24节:自定义View简单使用

当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求。

一、概述

很多初入Android开发的程序员,对于Android自定义View可能比较恐惧,但这又是高手进阶的必经之路,这里先不做过多学习,只是简单了解。关于高阶的内容会在后续课程陆续进行学习,欢迎关注分享达人秀(ShareExpert)获取第一手教程。

如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种:自绘控件、组合控件、以及继承控件。

·         自绘控件:内容都是开发者自己绘制出来的,一般在View的onDraw方法中完成绘制。

·         组合控件:就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件。比如很多应用中普遍使用的标题栏控件,其实用的就是组合控件。

·         继承控件:继承已有的控件,创建新控件,保留继承的父控件的特性,并且还可以引入新特性。

二、方法

介于目前掌握的Android基础知识较为薄弱,本节先简单学习一下自绘控件。首先定义一个继承View基类的子类,然后重写View 类的一个或多个方法。通常可以被用户重写的方法如下。

·         构造器:重写构造器是定制View的最基本方式,当Java代码创建一个View实例,或根据XML布局文件加载并构建界面时将需要调用该构造器。

·         onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它 来构建界面之后,该方法将会被回调。

·         onMeasure(int, int):调用该方法来检测View组件及其所包含的所有子组件的大小。

·         onLayout(boolean, int, int, int, int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。

·         onSizeChanged(int, int, int, int):当该组件的大小被改变时回调该方法。

·         onDraw(Canvas):当该组件将要绘制它的内容时回调该方法进行绘制。

·         onKeyDown(int, KeyEvent):当某个键被按下时触发该方法。

·         onKeyUp(int, KeyEvent):当松开某个键时触发该方法。

·         onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法。

·         onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法。

·         onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect):当该组件焦点发生改变时触发该方法。

·         onWindowFocusChanged(boolean):当包含该组件的窗口失去或得到焦点时触发该方法。

·         onAttachedToWindow():当把该组件放入某个窗口时触发该方法。

·         onDetachedFromWindow():当把该组件从某个窗口上分离时触发该方法。

·         onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法。

当需要开发自定义View时,开发者并不需要重写上面列出的所有方法,而是可以根据业务需要重写其中部分方法。

三、示例

下面就实现一个简单的计数器,每点击它一次,计数值就加1并显示出来。

在src/main/java文件下创建新包com.jinyu.cqkxzsxy.android.widgetsample.view,再新建一个CounterView.java文件,其代码如下:

[代码]java代码:01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61package com.jinyu.cqkxzsxy.android.widgetsample.view;

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;

/**

* @创建者 鑫鱻

* @描述 Android零基础入门到精通系列教程,欢迎关注微信公众ShareExpert

*/

public class CounterView   extends View {

//定义画笔

private Paint mPaint;

//用于获取文字的宽和高

private Rect mBounds;

//计数值,每点击一次本控件,其值增加1

private int mCount = 0;

public CounterView(Context context, AttributeSet   attrs) {

super(context,   attrs);

//初始化画笔、Rect

mPaint   = new Paint(Paint.ANTI_ALIAS_FLAG);

mBounds   = new Rect();

//本控件的点击事件

setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

mCount   ++;

//重绘

invalidate();

}

});

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(Color.BLUE);

//绘制一个填充色为蓝色的矩形

canvas.drawRect(0,   0, getWidth(), getHeight(), mPaint);

mPaint.setColor(Color.YELLOW);

mPaint.setTextSize(50);

String   text = String.valueOf(mCount);

//获取文字的宽和高

mPaint.getTextBounds(text,   0, text.length(), mBounds);

float textWidth = mBounds.width();

float textHeight = mBounds.height();

//绘制字符串

canvas.drawText(text,   getWidth() / 2 -   textWidth / 2, getHeight() / 2

+   textHeight / 2, mPaint);

}

}

关于里面的代码不懂也没有关系,后续会详细进行学习的。

到res/layout/目录下创建一个counterview_layout.xml文件,然后在其中填充如下代码片段:

[代码]xml代码:01

02

03

04

05

06

07

08

09

10

11<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/counter_view"

android:layout_width="100dp"

android:layout_height="100dp"/>

然后修改一下app/src/java/MainActivity.java文件中加载的布局文件为新建的counterview_layout.xml文件。

运行程序,点击自定义的计数控件,会发现每点击一次控件里面的值+。

至此,一些Android开发中一些常用的控件学习完毕,还记得学过哪些控件吗?都掌握的如何?我们从下一期开始一起来学习Android中的界面布局。

今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

打开App,阅读手记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值