一. 自定义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或者代码中设置是否显示或者隐藏. 同样也可以设置滚动条等设置;

【Android 应用开发】自定义View 和 ViewGroup的更多相关文章

  1. Android开发自定义View

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

  2. 开发自定义View

    当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的方法如下:构造器:重写构造器是定制View的最基本方法,当Java代码创建 ...

  3. android 自定义 view 和 ViewGroup

    ---恢复内容开始--- ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 :决定childView的位置:为什么只是建议的宽和高,而不是直接确定呢,别忘了childVie ...

  4. 自定义View和ViewGroup

    为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们的博客上面基本上都有讲这方面的内容,如 ...

  5. 自定义View和ViewGroup(有这一篇就够了)

    为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们的博客上面基本上都有讲这方面的内容,如 ...

  6. 自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  7. Android中使用自定义View实现下载进度的显示

    一般有下载功能的应用都会有这样一个场景,需要一个图标来标识不同的状态.之前在公司的项目中写过一个,今天抽空来整理一下. 一般下载都会有这么几种状态:未开始.等待.正在下载.下载结束,当然有时候会有下载 ...

  8. Android 初阶自定义 View 字符头像

    自己很少做自定义 View ,只有最开始的时候跟着郭神写了一个小 Demo ,后来随着见识的越来越多,特别是在开源社区看到很多优秀的漂亮的控件,都是羡慕的要死,但是拉下来的代码还是看不明白,而且当时因 ...

  9. android尺子的自定义view——RulerView

    项目中用到自定义尺子的样式: 原代码在github上找的,地址:https://github.com/QQabby/HorizontalRuler 原效果为 因为跟自己要使用的view稍有不同  所以 ...

随机推荐

  1. 使用maven执行单元测试总结

    maven本身没有单元测试框架,但是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件可以调用Junit3.Junit4.TestNG等Jav ...

  2. [Ubuntu] 14.04 关闭桌面

    一直在用Ubuntu的桌面来做调试环境,最近发现桌面会有崩溃的时候,占用资源也比较大,所以想把桌面关闭,只用command界面. 我的系统是Ubuntu14.04 Ctrl+Alt+F1 可以转到命令 ...

  3. SSL协议相关证书文件

    密钥: 我理解是公钥+私钥的统称. 密钥对: 公钥(证书)和私钥成对存在.通信双方各持有自己的私钥和对方的公钥.自己的私钥需密切保护,而公钥是公开给对方的.在windows下,单独存在的公钥一般是后缀 ...

  4. JQuery 网页选项卡制作

    网页选项卡可以较好的利用有限的页面来展示更多的元素,而使用JQuery来制作网页选项卡也是一件非常简单的事情.今天就来分享一个网页选项卡的制作小技巧. 引入所需库 选项卡原理 业务核心 完整小例子 引 ...

  5. Gazebo機器人仿真學習探索筆記(一)安裝與使用

    Gazebo提供了多平臺的安裝和使用支持,大部分主流的linux,Mac以及Windows,這裏結合ROS以Ubuntu爲例進行介紹. 首先是參考資料:http://gazebosim.org/tut ...

  6. Xcode7.2如何真机调试iOS 9.3的设备

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本猫的mac系统为10.10,Xcode版本为7.2 本猫将i ...

  7. Sky(dart)语言介绍-android学习之旅(十)

    认识dart语言 google于2011年10月10日发布了"dart"语言的"早起预览版",google希望利用这款语言,帮助开发者克服javaScript的 ...

  8. Android多点触摸缩放图片-android学习之旅(四)

    获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction ...

  9. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...

  10. Shell脚本编程入门(一)

    最近在学shell,记录一下. if语句的使用: 1.判断两个参数大小 #!/bin/sh #a test about if statement a=10 b=20 if [ $a -eq $b ]; ...