Android自定义控件基础知识----View的生命周期
2017-11-10 15:25
495 查看
项目结构
核心代码:
一、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
核心代码:
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
相关文章推荐
- Android基础知识之四大组件Activity(三)多个Activity交互的生命周期与设计思想
- android基础知识复习(一)——对话框风格的Activity、Menu、Activity生命周期
- 【Android 自定义控件】自定义View相关知识总结
- android基础知识——android生命周期
- Android中的RecyclerView: 基础知识
- Android-View事件体系之View的基础知识
- android 自定义view 前的基础知识
- android学习中关于Textview,Button,EditText,连接的设置,Intent,Activity不同状态等的一系列基础知识点
- [Android基础知识] 之十一: View类的原理与使用
- Android基础知识之控件系列(1)——TextView及自定义动态TextView
- Android基础知识:Activity生命周期和Intent用法
- Android View 基础知识
- [自定义控件]android自定义view基础
- Android 基础知识---Activity生命周期
- 自定义控件基础知识2 -- 自定义ViewGroup
- 【Android基础知识】ViewStub的使用
- Android --View基础知识
- Android基础知识之四大组件Activity(二)一个Activity的生命周期?
- Android控件之WebView(基础知识)
- Android基础知识--2.Activity的生命周期