自定义View 和 ViewGroup
一. 自定义View介绍
自定义View时, 继承View基类, 并实现其中的一些方法.
(1) ~ (2) 方法与构造相关
(3) ~ (5) 方法与组件大小位置相关
(6) ~ (9) 方法与触摸按键相关
(10) ~ (12) 方法与窗口 焦点相关
(1) 构造方法
该构造方法在创建View实例, 或者从XML布局中加载并构建界面的时候调用.
(2)加载回调方法
- protected void onFinishInflate()
回调方法, 从XML布局中加载该重写的View组件的时候, 就会回调这个方法;
(3)测量方法
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
这个方法用来检测View组件以及该View组件包含的子组件的大小
(4)定位组件方法
- protected void onLayout(boolean changed, int left, int top, int right,int bottom)
被重写的View组件分配在其中的子组件的位置 和 大小的时候, 回调这个方法;
(5)大小改变方法
- protected void onSizeChanged(int w, int h, int oldw, int oldh)
当组件大小被改变的时候回调该方法;
(6)按键方法
- public boolean onKeyDown(int keyCode, KeyEvent event)
当某个键被按下时触发该方法;
(7)松开键方法
- public boolean onKeyUp(int keyCode, KeyEvent event)
当某个键松开的时候调用该方法;
(8)轨迹球事件方法
- public boolean onTrackballEvent(MotionEvent event)
发生轨迹球事件时触发该方法;
(9)触摸方法
- public boolean onTouchEvent(MotionEvent event)
当发生触摸时间时触发该方法;
(10)焦点改变方法
- public void onWindowFocusChanged(boolean hasWindowFocus)
当组件得到, 失去焦点的时候回调的方法;
(11)组件进入窗口方法
- protected void onAttachedToWindow()
当把组件放入窗口的时候, 回调这个方法
(12)组件分离窗口方法
- protected void onAttachedToWindow()
当把组件从某个窗口分离触发的方法
(13)窗口可见性改变方法
- protected void onWindowVisibilityChanged(int visibility)
当包含该组件的窗口发生改变的时候触发的方法
二. 实现一个跟随手指的小球View
1. 自定义View
自定义一个View组件铺满全屏, 在绘制该View组件的时候, 在onDraw()方法中根据一个xy坐标绘制一个小球;
这个xy坐标在触摸回调方法onTouchEvent()方法中动态改变, 当检测到触摸位置发生改变, 那么就重新给xy坐标赋值, 并且调用invalidate()方法重绘该组件, invalidate()方法执行后, 会回调onDraw()方法;
- public class FollowBallView extends View {
- public float currentX = 40;
- public float currentY = 50;
- Paint paint = new Paint();
- public FollowBallView(Context context) {
- super(context);
- }
- public FollowBallView(Context context, AttributeSet set) {
- super(context, set);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- paint.setColor(Color.RED);
- canvas.drawCircle(currentX, currentY, 15, paint);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- currentX = event.getX();
- currentY = event.getY();
- //重绘
- invalidate();
- return true;
- }
- }
2. xml文件
在这个xml文件中, 引入自定义的布局, 使用完整的类名包名可以引入该自定义View组件;
引入组件后, 充满整个布局;
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <shuliang.han.followball.FollowBallView
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </RelativeLayout>
3. Activity中显示该组件
- public class MainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
4. 效果图
三. ViewGroup简介
1.View和ViewGroup关系
UI组件在Android中的位置 : Android中的UI组件大部分都放在android.widget 或者 android.view包中; View组件 和 ViewGroup组件都在android.view包中;
View 和 ViewGroup关系 :
继承关系 : ViewGroup是View的子类, 因此ViewGroup有View的一切属性, 可以当做View来使用, ViewGroup主要是当做容器使用; View是小控件widget和容器组件ViewGroup的父类, ViewGroup是布局如LinearLayout的基类;
包含关系 : ViewGroup中可以包含View和ViewGroup, ViewGroup可以无限嵌套;
View和ViewGroup关系图解 :
抽象类 : ViewGroup是一个抽象类, 作为容器的类通常是ViewGroup的子类; ViewGroup子类对象有 : LinearLayout, FrameLayout等布局;
2. ViewGroup中的内部类
两个内部类 :
ViewGroup通过Viewgroup.LayoutParams和ViewGroup.MarginLayoutParams来控制容器中的组件;
ViewGroup.LayoutParams支持的XML属性 :
android:layout_height属性(指定布局高度) 和 android:layout_width属性(指定布局宽度), 这两个属性的值可以为 fill_parent, match_parent, wrap_content, 其中充满布局空间推荐使用match_parent;
组件的宽高 与 布局的宽高 : Android的组件的高度和宽度不是其实际的宽度和高度, 组件实际的高度和宽度同样受布局的宽高影响, 例如设置组件的宽度为100px, 如果设置布局宽度(layout_width)为match_parent, 那么组件的实际宽度就会被拉宽到整个布局, 如果设置布局的宽度为wrap_content,
那么组件的实际宽度就是100px;
ViewGroup.MarginLayoutParams支持的XML属性 :
android:layout_marginBottom : 指定该子组件到父容器下边界的距离, 同理android:layout_marginTop, android:layout_marginLeft, android:layout_marginRight,
3. View介绍
View可以有两种方式创建 : 一种是靠XML文件创建, 一种是靠代码创建;
这里只是简单的介绍下, View详细的属性会单独有一篇博客进行总结;
View创建关注的方面 :
(1)设置属性
长宽等属性可以在XML中设置, 也可以在代码中设置;
(2)请求焦点
可以通过函数实现焦点转变, 可以根据不同的焦点设置背景;
焦点类别 : 可获取的焦点, 不可获取的焦点, 可以获取但是正在触摸状态下的焦点;
(3)设置事件监听
View在本身发生变化的时候, 会将信息广播出去, 这边变化例如 : 点击, 焦点改变等;
一个事件的广播到来, 该事件就会传递到相应的View中对应的监听器里, 相当于回调View中的监听器方法;
(4)设置显示与隐藏
View可以在XML或者代码中设置是否显示或者隐藏. 同样也可以设置滚动条等设置;
自定义View 和 ViewGroup的更多相关文章
- 自定义View和ViewGroup
为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们的博客上面基本上都有讲这方面的内容,如 ...
- android 自定义 view 和 ViewGroup
---恢复内容开始--- ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 :决定childView的位置:为什么只是建议的宽和高,而不是直接确定呢,别忘了childVie ...
- 【Android 应用开发】自定义View 和 ViewGroup
一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...
- 自定义View和ViewGroup(有这一篇就够了)
为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们的博客上面基本上都有讲这方面的内容,如 ...
- Android自定义组件系列【1】——自定义View及ViewGroup
View类是ViewGroup的父类,ViewGroup具有View的所有特性,ViewGroup主要用来充当View的容器,将其中的View作为自己孩子,并对其进行管理,当然孩子也可以是ViewGr ...
- Android View和ViewGroup
View和ViewGroup Android的UI界面都是由View和ViewGroup及其派生类组合而成的. 其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也 ...
- View与ViewGroup有什么区别?
百度知道:http://zhidao.baidu.com/link?url=B5MFOzDlww8soYqr5CL5FldH4sXD6eumS1XTRn8XEh8gu4mKjQdPkJSLIBt7u_ ...
- android view、viewgroup 事件响应拦截处理机制
文章中会用到部分网络资源,首先将原作者的链接附上. 但是还是会附上数量较大的关于此部分内容的自己的思考. ----------------------------------------------- ...
- 自定义View_1_关于View,ViewGroup的测量和绘制流程
自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到 ...
随机推荐
- table表单制作个人简历
应用table表单,编程个人简历表单,同时运用了跨行rowspan和跨列colspan. <!DOCTYPE html> <html> <head> <met ...
- 关于python的菜鸟教程
1.正则表达式 http://www.runoob.com/regexp/regexp-metachar.html 2.python正则表达死 http://www.runoob.com/python ...
- python代理爬取存入csv文件
爬取高匿代理 from urllib import request import re import time f = open('西1.csv','w',encoding='GBK') header ...
- 【blockly教程】第二章 Blockly编程基础
2.1 Blockly的数据类型 2.1.1 数据的含义 在计算机程序的世界里,程序的基本任务就是处理数据,无论是数值还是文字.图像.图形.声音.视频等信息,如果要在计算机中处理的话,就必须将它们转 ...
- Java面向对象之抽象方法&接口
在开始写抽象类之前,有一个问题我觉得想清楚会对理解抽象类很有帮助:那就是为什么要设计抽象类? 难道用类还不够么,为什么要设计出抽象类这样一个东西.我们可以换个角度来理解,就是有些类本来就是不应该被实例 ...
- Spring Cloud 分布式事务管理
Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Clo ...
- 北京Uber优步司机奖励政策(2月18日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- ONTAK 2010 aut
Autostrady https://szkopul.edu.pl/problemset/problem/f2dSBM7JteWHqtmVejMWe1bW/site/?key=statement 题意 ...
- Python破解压缩包密码问题
所用知识 1. Pool 进程池 2. try...except 异常处理 3.枚举的方式 4.生成器的运用 逻辑关系 通过生成假密码去碰撞!捕获异常,一直碰撞,直到生成的密码与压缩包建立的密码对应, ...
- mysql 题目练习
1 新建一个测试数据库: create database test1 charset utf8; 2 进入数据库 use test1; 3 新建一个sql 文件 ,将下面内容复制进sql 文件 /* ...