invalidate()含义
invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。
对于屏幕刷新有以下集中情况可以考虑:
1.不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
我们自定义View可以随意的滑动的图标,代码示例如下

public class BallView extends View {private Bitmap mBall;private Paint mPaint;private float mTouchX = 0;private float mTouchY = 0;public BallView(Context context) {super(context);}public BallView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mBall = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);mPaint = new Paint();}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(mBall,mTouchX,mTouchY,mPaint);}/*** 手指摸哪里,小球跟着去哪里* 触摸事件* @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {mTouchX = event.getX();mTouchY = event.getY();//重新绘制invalidate();//true,消费事件,false,不消费,默认falsereturn true;}}

布局文件中使用

  <com.wq.myviewdemo.BallViewandroid:layout_width="match_parent"android:layout_height="wrap_content"/>

效果图如下所示

2.使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量, 你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
3.使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。

Android 自定义View中invalidate()的自动清屏含义以及屏幕刷新相关推荐

  1. android中invalidate()的自动清屏含义以及屏幕刷新

    invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...

  2. Android 自定义View中坐标点的理解学习(一)

    本文主要是记录学习自定义view中看到的资料,为了方便记忆做了保存整理便于自己学习也方便其他Android开发爱好者学习,参考资料看底部链接. 一.getLocationInWindow和getLoc ...

  3. android 自定义paint,Android自定义View中Paint、Rect、Canvas介绍(一)

    自定义View对于新手而言貌似是一个很复杂的东西.格式,各函数的意义.对于大神经常忘记各函数及一些参数的具体写法及意义,刚好在做一个风车效果,把过程及遇到的问题都写下来 1.如何自定义一个View p ...

  4. Android 自定义 View 中 onKeyDown监听 没反应

    刚刚学到View,不想看书了,自己动手一些简单的操作,才开始画图就出来问题了,居然按照方法来,监听事情不行了,明明添加 了监听 在网上找了些资料终于明白了: 原来是焦点问题,我们注意View中有监听事 ...

  5. android resolvesize方法,Android 自定义View中onMeasure()中使用resolveSize()是什么意思?

    缥缈止盈 public static int resolveSize(int size, int measureSpec) {         int result = size;         i ...

  6. android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性

    android 自定义view属性 一个完美的自定义控件也可以添加xml来配置属性和风格.要实现这一点,可按照下列步骤来做: 1) 添加自定义属性到xml文件中 2) 在xml的中,指定属性的值 3) ...

  7. 精通Android自定义View(十六)invalidate方法和requestLayout方法

    1 简述 requestLayout方法会导致View的onMeasure.onLayout.onDraw方法被调用:invalidate方法则只会导致View的onDraw方法被调用 2 reque ...

  8. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  9. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

最新文章

  1. 一个与生命起源有关的悖论终于得到了解决
  2. 使用AndroidStudio创建自定义gradle插件并被引用实战例子
  3. strtus2.3 java.lang.NoSuchFieldException: DEFAULT_PARAM
  4. 同源策略_如何支持跨域
  5. 技术这东西,不可不看,不可全看.
  6. bzoj:1692 [Usaco2007 Dec]队列变换1640 [Usaco2007 Nov]Best Cow Line 队列变换
  7. Docker基础知识:Containers,Namespace,CGroups
  8. 客服机器人代码_企业微信群机器人如何快速集成?无需开发连接微信公众号,表单系统,钉钉,推广,CRM,客服系统和数据库...
  9. eviews建立时间序列模型_模型建立——时间序列 eviews协整检验(EG两步法(Engle-Granger))...
  10. win10任务栏透明_生命在于折腾,用三个小软件美化你的Win10桌面
  11. 1bit 寄存器 coursera
  12. python学习(25) BeautifulSoup介绍和实战
  13. 星起航:跨境电商行业卖家可利用新技术打造成熟供应链
  14. Front Immunol 复现 | 4. 使用estimate包评估肿瘤纯度
  15. 超级实习生提供IT培训吗?能保证技术进大厂实习吗?
  16. 萧红《生死场》读后感
  17. 【sm2算法】基于mbedtls开源库国密算法的使用(一)
  18. CCRC信息安全服务资质认证的意义
  19. 中小企业软文营销怎么做有什么好处?
  20. bat文件显示命令echo off和@

热门文章

  1. 基于asp.net土特产交易系统
  2. 平安京s9服务器维护,《决战平安京》S9赛季环境调整了什么 S9赛季环境调整内容分享...
  3. 使用 React 和 Threejs 创建一个VR全景项目
  4. 喵哈哈村的狼人杀大战(5)
  5. 微信小程序 - DZMDrawingBoard - (Canvas封装的画板、手写签名、生成图片、保存相册...库)
  6. 【Ok周志】开源(程序功能:自动编写周志)
  7. 读懂让自己更智慧的10句话
  8. 转型升级之路怎么走?山东这家枕头企业跨界建睡眠大数据
  9. 15个专业的基本技能
  10. 如何入门黑客技术,黑客技术入门该学什么?