您的位置:首页 > 移动开发 > Android开发

Android自定义控件基础知识----View的生命周期

2017-11-10 15:25 495 查看
项目结构



核心代码:

MyTextView中

package com.zhh.myview;

import android.content.Context;
import android.content.IntentSender;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

/**
*
* http://www.gulixueyuan.com/course/112/learn#lesson/1748 */
public class MyTextView extends TextView{

/**
* 创建对象加入布局时用到
* setContentView(new MyTextView(context))时会被调用
* @param context
*/
public MyTextView(Context context) {
super(context);
Log.e("111","MyTextView(Context context)");
}

/**
*在xml显示布局时用到
*setContentView(R.layout.activity_main);时会被调用
*/
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e("111","MyTextView(Context context, AttributeSet attrs)");
}

/**
* 重写onFinishInflate得到子view对象
* 布局文件加载成功
* setContentView(new MyTextView(context))时会被调用
* setContentView(R.layout.activity_main);时不会被调用
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate();
Log.e("111","onFinishInflate()");
}

/**
* 和window对象关联
* 重写onAttachedToWindow也可得到子view对象
*/
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Log.e("111","onAttachedToWindow()");
}

/**
* 测量
* 计算并确定视图的大小
* 得到当前视图的宽高,保存指定的宽高
* 常用方法
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.e("111","onMeasure(int widthMeasureSpec, int heightMeasureSpec)");
}

/**
* 指定孩子视图的位置
* 一般在ViewGroup中重写,因为view没有孩子
* 常用方法
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.e("111","onLayout(boolean changed, int left, int top, int right, int bottom)");
}
/**
* 绘制
* 一般在View中重写
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e("111","onDraw(Canvas canvas)");
}
/**
* 一般直接调用,不会重写
* 强制重绘,在主线程调用
* 会调用onDraw(canvas)
* 常用方法
*/
@Override
public void invalidate() {
super.invalidate();
Log.e("111","invalidate()");
}

/**
* 一般直接调用,不会重写
* 强制重绘
* 在主线程子线程都能调用
* 会调用onDraw(canvas)
*/
@Override
public void postInvalidate() {
super.postInvalidate();
Log.e("111","postInvalidate()");
}

/**
* 事件处理
* 一般用接口回调出去
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("111","onTouchEvent(event)");
return super.onTouchEvent(event);

}

/**
* 和window对象断开关系
* 视图死亡(视图被移除,或者activity死亡之前)时调用
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.e("111","onDetachedFromWindow");
}
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.zhh.myview.MainActivity">

<com.zhh.myview.MyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试"
/>
</RelativeLayout>
总结
一、view的生命周期中常用方法

1构造方法

2测量onMeasure(int widthMeasureSpec, int heightMeasureSpec)

 得到当前视图的宽高,保存指定的宽高

3位置onLayout(boolean changed, int left, int top, int right, int bottom)

 指定孩子视图的位置

 一般在ViewGroup中重写,因为view没有孩子

4绘制onDraw(Canvas canvas)

 一般在View中重写,ViewGroup中不重写

二、常用调用的方法

强制绘制invalidate()

只能在主线程调用会调用,会调用onDraw(Canvas canvas)方法的执行

强制绘制postInvalidate()

在主线程子线程都能调用,会调用onDraw(Canvas canvas)方法的执行

三、事件处理

重写onTouchEvent(MotionEvent event)方法,用借口回调出去处理

关于事件分发机制参看 
http://blog.csdn.net/zhaihaohao1/article/details/78338270

参考视频:

http://www.gulixueyuan.com/course/112/learn#lesson/1748

源码下载:

http://download.csdn.net/download/zhaihaohao1/10113421
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: