当我们开发中遇到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文件,其代码如下:
package 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 version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.jinyu.cqkxzsxy.android.widgetsample.view.CounterView android:id="@+id/counter_view" android:layout_width="100dp" android:layout_height="100dp"/> </LinearLayout>
然后修改一下app/src/java/MainActivity.java文件中加载的布局文件为新建的counterview_layout.xml文件。
运行程序,点击自定义的计数控件,会发现每点击一次控件里面的值+1,如下图所示效果。
至此,一些Android开发中一些常用的控件学习完毕,还记得学过哪些控件吗?都掌握的如何?我们从下一期开始一起来学习Android中的界面布局。
今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!
此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若转载请备注出处,特此声明!
往期总结分享:
Android零基础入门第1节:Android的前世今生
Android零基础入门第2节:Android 系统架构和应用组件那些事
Android零基础入门第3节:带你一起来聊一聊Android开发环境
Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招
Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神
Android零基础入门第6节:配置优化SDK Manager, 正式约会女神
Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点
Android零基础入门第9节:Android应用实战,不懂代码也可以开发
Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio
Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌
Android零基础入门第13节:Android Studio配置优化,打造开发利器
Android零基础入门第14节:使用高速Genymotion,跨入火箭时代
Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
Android零基础入门第16节:Android用户界面开发概述
Android零基础入门第17节:TextView属性和方法大全
Android零基础入门第18节:EditText的属性和使用方法
Android零基础入门第19节:Button使用详解
Android零基础入门第20节:CheckBox和RadioButton使用大全
Android零基础入门第21节:ToggleButton和Switch使用大全
Android零基础入门第22节:ImageView的属性和方法大全
Android零基础入门第23节:ImageButton和ZoomButton使用大全