Android开发自定义View
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相关推荐
- android开发自定义View(三)仿芝麻信用积分
此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...
- Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI !(附带Demo)
一. 前言: 兜兜转转,不知不觉做Android开发已经快2年了,上半年一直在搞wifi模块开发,导致不务正业,写个自定义UI还要折腾半天,真是对不起自己的良心了!最近要对接小米开放平台,不小心看到了 ...
- Android开发自定义View之滑动按钮与自定义属性
写博客辛苦了,转载的朋友请标明出处哦,finddreams:(http://blog.csdn.net/finddreams/article/details/40392975) 话不多说,先运行效果图 ...
- Android开发自定义View实现数字与图片无缝切换的2048
本博客地址:http://blog.csdn.net/talentclass_ctt/article/details/51952378 最近在学自定义View,无意中看到鸿洋大神以前写过的2048(附 ...
- android开发自定义View(四)仿掌上英雄联盟能力值分析效果
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 原始图效果 模仿效果 PNG GIF 流程 绘制中心线,用于计算外层多边形各点的坐标 绘制最外层多边形 分析原型图算出每个多边形之间 ...
- Android开发自定义UI组件
Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTou ...
- Android开发——自定义炫酷PickerView惯性滚动魔改
Android开发--自定义炫酷PickerView快速滚动魔改 最近由于课内压力的增加和安卓课设项目,故没有怎么刷acm题,基本上学校要训练也就去水一波,程序设计相关内容也鸽了. 由于从来没有做过开 ...
- android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...
本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...
- Android 系统(264)---android进阶——自定义View
android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性 https://www.jianshu.com/p/48944aad200 ...
最新文章
- 信息安全 数据赛 铁人三项_2018信息安全铁人三项数据赛题解
- svm java_SVM入门(十)将SVM用于多类分类
- [过年菜谱之]红烧甲鱼
- JSP 文件上传下载系列之一[基本方式上传文件]
- 基于用户长短期表示的新闻推荐
- 【服务器】【私人书库】宝塔安装calibre-web
- Julia: 通过简单实践理解机器学习概念(flux.jl)
- 联想用u盘重装系统步骤_联想笔记本Y470 U盘重装系统过程教程
- 个人做代理记账如何接活
- html5 p 字号,五号字是多少pt?
- hexo入门学习(六):文章图片存储到七牛云
- mysql编程界面_MySQL图形界面客户端
- 产品日记(二)一些愚见, 记录在此
- pythonend什么意思_Python中的 \t 和 end=” 是什么意思?
- 多数据源,提示无效的绑定语句(Invalid bound statement (not found))
- 基于小波分析的打鼾(阻塞性睡眠呼吸暂停)检测
- 入职阿里巴巴,成为年薪百万阿里P7高级架构师需要必备哪些技术栈
- phpcms富文本框上传图片去除水印
- 中金数据联手华为深入布局行业云
- PHPstudy设计简单登录界面
热门文章
- 事务,Oracle,MySQL及Spring事务隔离级别
- linux系统的学习经验首篇
- node.js实现formdata上传文件
- 部署分布式文件系统(DFS)
- ASP.NET把DataTable转成XML文件的函数
- 客户端验证:JQuery Validation Plugin
- Spring创建对象的三种方式以及创建时间
- 更新 Ubuntu 系统,避免报错「校验和不符」
- boost::asio::ip::tcp::resolver::query定义不正确导致boost::asio::ip::tcp::resolver的resolve抛出异常...
- GRIDVIEW控件删除数据前如何给予客户端提示