昨天在做一个界面时,想在用户touch屏幕之后先绘图一下,待逻辑处理完毕,再绘制最后的图,查看View的重绘方法,得知是invalidate()函数,于是在代码中这么写道:

view plain copy to clipboard print ?
  1. publicclassPuzzleViewextendsView{
  2. @Override
  3. protectedvoidonDraw(Canvascanvas){
  4. ...
  5. }
  6. @Override
  7. publicbooleanonTouchEvent(MotionEventevent){
  8. invalidate();
  9. //处理逻辑
  10. invalidate();
  11. }
  12. }

写完,运行,oh,my god,只有第二次invalidate做了,第一次打酱油去了,翻资料,翻啊翻,看到Invalidate()的描述是这样的:当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面,奶奶的,不刷。。。继续翻啊翻,看到SurfaceView 能实现实时刷新,代码结构如下:

view plain copy to clipboard print ?
  1. publicclassPuzzleViewextendsSurfaceViewimplementsSurfaceHolder.Callback{
  2. privateSurfaceHoldersurfaceHolder;
  3. publicPuzzleView(Contextcontext){
  4. //....
  5. surfaceHolder=this.getHolder();//获取holder
  6. surfaceHolder.addCallback(this);
  7. }
  8. protectedvoidpaint(Canvascanvas){
  9. //这里的代码跟继承View时OnDraw中一样
  10. }
  11. publicvoidrepaint(){
  12. Canvasc=null;
  13. try{
  14. c=surfaceHolder.lockCanvas();
  15. paint(c);
  16. }finally{
  17. if(c!=null){
  18. surfaceHolder.unlockCanvasAndPost(c);
  19. }
  20. }
  21. }
  22. }

好了,这样写好后,只要在以前调用invalidate()的地方调用repaint()就OK了~

更多相关文章

  1. Android(安卓)porting (s3c6410)
  2. Android中的ViewRootImpl类源码解析
  3. android接入原生第三方登录(微信登录、QQ登录、新浪微博登录)
  4. Android(安卓)studio 原生自带下拉加载控件SwipeRefreshLayout使
  5. android java 层参数重载glVertexAttribPointer 在es20 C 接口中
  6. Android中 Webview中js与Activity的交互
  7. android textview settext卡顿深层次原因
  8. Android(安卓)Service的两种启动方式,你知道吗?
  9. Android的Window底层原理

随机推荐

  1. Android开发者指南(11) ―― Optimizing
  2. Android NDK环境搭建
  3. Android(安卓)Lifecycle 生命周期管理
  4. HelloWorld-----Google手机操作系统Andro
  5. android客户端与服务端交互的三种方式
  6. android browser 的几个小feature (一)
  7. Android(安卓)地区语言和简写对照表
  8. 视频教程-Android Material Design 新控
  9. 不疯狂!非正常!
  10. Android 应用架构组件(Architecture Compo