View编程(2): invalidate()再探
来源:互联网 发布:网络黄金未来城网址 编辑:程序博客网 时间:2024/06/05 19:00
转自:http://blog.csdn.net/veryitman/article/details/6692950
博客 Android(四) :更新UI的http://blog.csdn.net/veryitman/article/details/6692950方法 中提到invalidate()方法,但是由于自己的阅历不足,没有过多的说明,只是泛泛而谈!本篇继续探究这个诡异的方法。
在阅读本篇博客之前,建议您先看看 View编程(1): Window、View与setContentView()
基于 Android(四) :更新UI的方法 中的例子,稍作修改:
- package mark.zhang;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.graphics.RectF;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- public class ViewDrawTestActivity extends Activity {
- // 用于测试
- static int times = 1;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(new MyView(this));
- }
- /**
- * 内部类,继承View
- *
- * @author mark
- */
- class MyView extends View {
- MyView(Context context) {
- super(context);
- }
- Paint vPaint = new Paint(); // 绘制样式物件
- int i = 0; // 弧形角度
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- Log.d("mark", "this run onDraw() " + (times++) + " times!");
- // 设定绘图样式
- vPaint.setColor(0xff00ffff); // 画笔颜色
- vPaint.setAntiAlias(true); // 反锯齿
- vPaint.setStyle(Paint.Style.STROKE);
- // 绘制一个弧形
- canvas.drawArc(new RectF(60, 120, 260, 320), 0, i, true, vPaint);
- // 弧形角度
- if ((i += 10) > 360)
- i = 0;
- // 重绘, 再一次执行onDraw 程序
- //invalidate();
- }
- }
- }
可以看出,图像只画了一条线,说明onDraw()方法被调用一次。从log上也可以看出来:
- D/mark ( 221): this run onDraw() 1 times!
setContentView()View view方法,其实是调用PhoneWindow的setContentView(View view)方法,调用关系如下:
从而可以看出,invalidate()方法是促使onDraw()方法被调用的力量。
那么,修改代码,将内部类MyView的onDraw()方法中的invalidate()注释取消,再看看运行效果:
控制台:
- D/mark ( 248): this run onDraw() 5629 times!
- D/mark ( 248): this run onDraw() 5630 times!
- D/mark ( 248): this run onDraw() 5631 times!
- D/mark ( 248): this run onDraw() 5632 times!
- D/mark ( 248): this run onDraw() 5633 times!
- D/mark ( 248): this run onDraw() 5634 times!
- D/mark ( 248): this run onDraw() 5635 times!
- D/mark ( 248): this run onDraw() 5636 times!
- D/mark ( 248): this run onDraw() 5637 times!
- D/mark ( 248): this run onDraw() 5638 times!
- D/mark ( 248): this run onDraw() 5639 times!
- D/mark ( 248): this run onDraw() 5640 times!
- D/mark ( 248): this run onDraw() 5641 times!
- D/mark ( 248): this run onDraw() 5642 times!
- D/mark ( 248): this run onDraw() 5643 times!
- D/mark ( 248): this run onDraw() 5644 times!
- D/mark ( 248): this run onDraw() 5645 times!
- D/mark ( 248): this run onDraw() 5646 times!
在invalidate()方法源码中,有这么一段注释:
- /**
- * Invalidate the whole view. If the view is visible, {@link #onDraw} will
- * be called at some point in the future. This must be called from a
- * UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
- */
这段话,说明了上面的实现(调用onDraw()方法)。但是在子线程中必须使用postInvalidate()方法。
如果有兴趣的话,请接着看 View编程(3): invalidate()源码分析
0 0
- View编程(2): invalidate()再探
- View编程(2): invalidate()再探
- View编程(2): invalidate()再探
- View编程:invalidate()源码分析
- View编程(3): invalidate()源码分析
- View 中的 requestLayout(); invalidate();
- view.invalidate()原理
- Android自定义View-invalidate()
- View invalidate方法研究
- View postInvalidateOnAnimation() invalidate()
- View中的 requestLayout(); invalidate();
- view invalidate流程
- View[1] requestLayout()、invalidate()
- View.invalidate()的调用顺序
- View的setSelected()与invalidate()
- View的绘制和invalidate
- android view requestLayout invalidate区别
- 自定义View执行invalidate()方法
- 存储结构和事务
- TW_第一次内容简介
- WEB服务器、应用程序服务器、HTTP服务器区别
- Wikioi 1017 乘积最大
- hdu 2063 过山车(匈牙利算法)
- View编程(2): invalidate()再探
- 蛰伏的辛星,必将爆发
- xampp 安装vmware后无法启动的解决方法
- hdu 2027 统计元音 20140728.cpp
- android Uri获取真实路径转换成File的方法
- java虚拟机的内存区域划分
- MemSQL Start[c]UP 2.0 - Round 1 .A
- poj1905
- 3Sum