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

来源:互联网 发布:如何在淘宝上购物 编辑:程序博客网 时间:2024/05/20 06:08

项目结构


核心代码:

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



原创粉丝点击