Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容。对于Android应用的其他UI组件来说,它们都继承了View组件,然后在View组件提供的空白区域绘制外观。

  当Android系统提供的UI组件不足以满足项目需求时,我们可以通过继承View并重写View类的一个或多个方法来自定义组件。

  通常可以被用户重写的方法如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

    14.onDetachedFromWindow():当把该组件从某个窗口中分离时触发该方法

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

  当我们在开发自定义View时,通常仅需根据业务需求重写上面的部分方法,如果自定义组件仅仅只是组合现有的组件那就更加简单了,仅仅实现自定义组件的构造器然后使用LayoutInflater加载布局文件即可。

⒈实例自定义View

 1 package cn.coreqi.view;
 2
 3 import android.content.Context;
 4 import android.graphics.Canvas;
 5 import android.graphics.Color;
 6 import android.graphics.Paint;
 7 import android.util.AttributeSet;
 8 import android.view.MotionEvent;
 9 import android.view.View;
10
11 public class DrawView extends View {
12     private float currentX = 40f;
13     private float currentY = 50f;
14
15     //定义并创建画笔
16     private Paint p = new Paint();
17
18     public DrawView(Context context) {
19         super(context);
20     }
21
22     public DrawView(Context context, AttributeSet attrs) {
23         super(context, attrs);
24     }
25
26     //当该组件将要绘制它的内容时触发该方法
27     @Override
28     protected void onDraw(Canvas canvas) {
29         super.onDraw(canvas);
30         //设置画笔的颜色
31         p.setColor(Color.RED);
32         //绘制一个小圆(作为小球)
33         canvas.drawCircle(currentX,currentY,15F,p);
34     }
35
36     //为该组件的触碰事件重写事件处理方法
37     @Override
38     public boolean onTouchEvent(MotionEvent event) {
39         //修改currentX,currentY两个成员变量
40         currentX = event.getX();
41         currentY = event.getY();
42         //通知当前组件重新绘制自己
43         invalidate();
44         //返回true表明该处理方法已经处理该事件
45         return true;
46     }
47 }

⒉在代码中创建自定义View

 1 package cn.coreqi;
 2
 3 import androidx.appcompat.app.AppCompatActivity;
 4
 5 import android.os.Bundle;
 6 import android.widget.LinearLayout;
 7 import cn.coreqi.view.DrawView;
 8
 9
10 public class MainActivity extends AppCompatActivity {
11
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         //新建LinearLayout布局容器
16         LinearLayout layout = new LinearLayout(this);
17         //设置该Activity显示layout
18         setContentView(layout);
19         //创建我们自定义的View组件
20         DrawView draw = new DrawView(this);
21         //设置自定义组件的最小宽度、高度
22         draw.setMinimumWidth(300);
23         draw.setMinimumHeight(500);
24         layout.addView(draw);
25     }
26 }

⒊在XML布局文件中创建自定义View

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context=".MainActivity">
 8
 9     <cn.coreqi.view.DrawView
10         android:id="@+id/drawView"
11         android:layout_width="match_parent"
12         android:layout_height="match_parent" />
13
14 </androidx.constraintlayout.widget.ConstraintLayout>

转载于:https://www.cnblogs.com/fanqisoft/p/11017395.html

Android开发自定义View相关推荐

  1. android开发自定义View(三)仿芝麻信用积分

    此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...

  2. Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI !(附带Demo)

    一. 前言: 兜兜转转,不知不觉做Android开发已经快2年了,上半年一直在搞wifi模块开发,导致不务正业,写个自定义UI还要折腾半天,真是对不起自己的良心了!最近要对接小米开放平台,不小心看到了 ...

  3. Android开发自定义View之滑动按钮与自定义属性

    写博客辛苦了,转载的朋友请标明出处哦,finddreams:(http://blog.csdn.net/finddreams/article/details/40392975) 话不多说,先运行效果图 ...

  4. Android开发自定义View实现数字与图片无缝切换的2048

    本博客地址:http://blog.csdn.net/talentclass_ctt/article/details/51952378 最近在学自定义View,无意中看到鸿洋大神以前写过的2048(附 ...

  5. android开发自定义View(四)仿掌上英雄联盟能力值分析效果

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 原始图效果 模仿效果 PNG GIF 流程 绘制中心线,用于计算外层多边形各点的坐标 绘制最外层多边形 分析原型图算出每个多边形之间 ...

  6. Android开发自定义UI组件

    Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTou ...

  7. Android开发——自定义炫酷PickerView惯性滚动魔改

    Android开发--自定义炫酷PickerView快速滚动魔改 最近由于课内压力的增加和安卓课设项目,故没有怎么刷acm题,基本上学校要训练也就去水一波,程序设计相关内容也鸽了. 由于从来没有做过开 ...

  8. android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  9. Android 系统(264)---android进阶——自定义View

    android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性  https://www.jianshu.com/p/48944aad200 ...

最新文章

  1. 信息安全 数据赛 铁人三项_2018信息安全铁人三项数据赛题解
  2. svm java_SVM入门(十)将SVM用于多类分类
  3. [过年菜谱之]红烧甲鱼
  4. JSP 文件上传下载系列之一[基本方式上传文件]
  5. 基于用户长短期表示的新闻推荐
  6. 【服务器】【私人书库】宝塔安装calibre-web
  7. Julia: 通过简单实践理解机器学习概念(flux.jl)
  8. 联想用u盘重装系统步骤_联想笔记本Y470 U盘重装系统过程教程
  9. 个人做代理记账如何接活
  10. html5 p 字号,五号字是多少pt?
  11. hexo入门学习(六):文章图片存储到七牛云
  12. mysql编程界面_MySQL图形界面客户端
  13. 产品日记(二)一些愚见, 记录在此
  14. pythonend什么意思_Python中的 \t 和 end=” 是什么意思?
  15. 多数据源,提示无效的绑定语句(Invalid bound statement (not found))
  16. 基于小波分析的打鼾(阻塞性睡眠呼吸暂停)检测
  17. 入职阿里巴巴,成为年薪百万阿里P7高级架构师需要必备哪些技术栈
  18. phpcms富文本框上传图片去除水印
  19. 中金数据联手华为深入布局行业云
  20. PHPstudy设计简单登录界面

热门文章

  1. 事务,Oracle,MySQL及Spring事务隔离级别
  2. linux系统的学习经验首篇
  3. node.js实现formdata上传文件
  4. 部署分布式文件系统(DFS)
  5. ASP.NET把DataTable转成XML文件的函数
  6. 客户端验证:JQuery Validation Plugin
  7. Spring创建对象的三种方式以及创建时间
  8. 更新 Ubuntu 系统,避免报错「校验和不符」
  9. boost::asio::ip::tcp::resolver::query定义不正确导致boost::asio::ip::tcp::resolver的resolve抛出异常...
  10. GRIDVIEW控件删除数据前如何给予客户端提示