Android零基础入门第24节:自定义View简单使用
原文: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文件,其代码如下:

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;// 计数值,每点击一次本控件,其值增加1private int mCount = 0;public CounterView(Context context, AttributeSet attrs) {super(context, attrs);// 初始化画笔、RectmPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mBounds = new Rect();// 本控件的点击事件setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {mCount ++;// 重绘
                invalidate();}});}@Overrideprotected 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.CounterViewandroid: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使用大全

posted on 2017-08-12 10:39 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/7349212.html

Android零基础入门第24节:自定义View简单使用相关推荐

  1. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  2. Android零基础入门第40节:自定义ArrayAdapter

    原文:Android零基础入门第40节:自定义ArrayAdapter ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成 ...

  3. Android零基础入门第30节:两分钟掌握FrameLayout帧布局

    原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...

  4. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

  5. Android零基础入门第38节:初识Adapter

    2019独角兽企业重金招聘Python工程师标准>>> 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MV ...

  6. Android零基础入门第77节:Activity任务栈和启动模式

    2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的 ...

  7. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

  8. Android零基础入门第89节:Fragment回退栈及弹出方法

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一. ...

  9. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

最新文章

  1. GCC中通过--wrap选项使用包装函数
  2. 微信小程序打开预览下载的文件
  3. 在vue-cli项目中使用echarts
  4. 10.29T1 倍增+同余
  5. Eclipse 工作目录被破坏,导致Eclipse 打不开
  6. phpmyadmin使用远端mysql
  7. Qt工作笔记-双击TreeWidget列进行数据修改
  8. 将iso镜像包设置成yum源_Centos7 Nginx搭建局域网yum仓库详细步骤,转发
  9. phoneGap 中修改生成APP的名字
  10. MyBatis框架笔记05:MyBatis条件查询
  11. HTM服务器l控件与WEB服务器控件(一)
  12. 50.Linux/Unix 系统编程手册(下) -- 虚拟内存操作
  13. 在CentOS7上安装MySQL的心路历程
  14. 顶级黑客整理的588本编程电子书,整整46个G,你想学的都有
  15. 上次来杭州,已经六年了。。
  16. 《三体3:死神永生》读后感
  17. Codeforces 1437 F. Emotional Fishermen —— dp
  18. 惠州市有哪些学计算机的学校,惠州有哪些好学校?
  19. java 接口重写_java如何实现接口中的重写
  20. 华为 H1B 2014办理详情

热门文章

  1. Hybrid app 学习资料收集
  2. git checkout 命令详解—— Git 学习笔记 16
  3. 引入sentinel后,json转化异常
  4. 数据库连接池技术--c3p0
  5. STM32开发 -- 4G模块开发详解(4)
  6. 研发工作中芯片选型需要考虑的问题
  7. java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
  8. JAndFix: 基于Java实现的Android实时热修复方案
  9. Android Activity中加入View后进行后台截屏截图
  10. format 转化时间格式不起作用