============问题描述============

我现在有一个需求,要自定义View,初始化的时候调用了onDraw方法,完后我自定义一个方法,调用该方法的时候,要重新调用onDraw方法,但我用postInvalidate无效,代码如下:

启动类:

public class MainActivity extends Activity {TestOnDraw view;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);view = (TestOnDraw) findViewById(R.id.test);new Thread(new Runnable() {@Overridepublic void run() {view.test();}}).start();}}

布局文件:

<LinearLayout 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"><com.example.testdraw.TestOnDraw android:id="@+id/test"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

自定义View

public class TestOnDraw extends View {public TestOnDraw(Context context) {this(context, null);}public TestOnDraw(Context context, AttributeSet attrs) {this(context, attrs, 0);}public TestOnDraw(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);Log.d("test", "in");}public void test() {postInvalidate();}}

我查看日志,onDraw方法只进了一次,就是说postInvalidate();没有生效,我如何修改能实现在初始化进入onDraw后,调用test方法时再次进入onDraw方法

============解决方案1============

onDraw()的方法是当在屏幕中需要显示界面的时候才调用的,android会判断某个界面是否需要绘制,如果不需要就根本不会调用到他的onDraw 方法, 例如你把你的自定义view设置为GONE,那么你根本看不到打出来的log了

另外,为什幺要调用postInviliade呢, Java 的动态绑定机制不是会默认调用子类的onDraw方法吗? 你在线程中再调取一次postInvliade有什么意义吗?

============解决方案2============

引用 7 楼 luqing414 的回复:

Quote: 引用 3 楼 kifile 的回复:

onDraw()的方法是当在屏幕中需要显示界面的时候才调用的,android会判断某个界面是否需要绘制,如果不需要就根本不会调用到他的onDraw 方法, 例如你把你的自定义view设置为GONE,那么你根本看不到打出来的log了

另外,为什幺要调用postInviliade呢, Java 的动态绑定机制不是会默认调用子类的onDraw方法吗? 你在线程中再调取一次postInvliade有什么意义吗?

我是程序要不断的去改变这个自定义View的显示形状,所以要不断的重绘,我这里为了让问题清楚没有将其他逻辑包含进来

..那就在 onDraw() 里调用invaliade,另外建议使用Surface View 实现,避免阻塞线程

============解决方案3============

引用 6 楼 luqing414 的回复:

Quote: 引用 5 楼 lionfresh 的回复:

我觉得在view = (TestOnDraw) findViewById(R.id.test)时onDraw并不是延迟执行了,而是根本就没有执行。

执行了,我说清空test方法就是将test方法弄成空实现,里面一行代码都没有,完后可以看到onDraw还是调用了的

postInvalidate() 是往UI队列中丢一个线程,之后开始渲染流程。

在onCreate中 所有的界面并没有实际生成,所以会优先执行postInvalidate中的代码(这个在渲染队列前头)。
但是这个是没有效果的。 view 中有个skipInvalidate()方法 说的就是 当view未显示时候,是被skip掉的。

假如你delay了这个1-2秒,  这个代码执行时后界面已经生成了,他的invalidate就生效, 就会出现你想要的执行两次。

另 界面生成时候,必然会调用一次onDraw。

/**
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} 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()}.
     */
    public void invalidate() {
        invalidate(true);
    }

public void invalidate(Rect dirty) {
        if (skipInvalidate()) {
            return;
        }
     }
}

转载于:https://www.cnblogs.com/llj1985522/p/4038883.html

自定义View调用onDraw方法相关推荐

  1. Android自定义View的实现方法,带你一步步深入了解View(四)

    不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了LayoutInflater的原理分析.视图的绘制流程.视图的状态及重绘等知识,算是把View中很多重要的知识 ...

  2. android自定义view案例,Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在 ...

  3. Android中自定义view的onMeasure()方法详谈

    背景 理解MeasureSpec MeasureSpec 情况分析 结合图例分析 总结 A little bit of progress every day!Come on! 背景 首先关于自定义vi ...

  4. 自定义View之onDraw

    原文地址http://www.jianshu.com/p/369f66035666Android 中已经提供了很多的 View 给我们使用,但是有时候因为特殊需求的原因,这些 View 并不能满足需求 ...

  5. Android自定义View的实现方法,带你一步步深入了解View

    如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.那么下面我们就来依次学习一下,每种方式分别是如何自定义View的. 一.自绘控件 自绘控件的意思就 ...

  6. android自定义view的实现方法,Android自定义View的实现方法

    一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了. 如果说要按类型来划分的话,自定义Vi ...

  7. View (五)自定义View的实现方法

    一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了. 如果说要按类型来划分的话,自定义Vi ...

  8. 自定义View之onMeasure()方法

    前言 一个View从创建到被绘制到屏幕上,需要完成measure(测量).layout(布置).draw(绘制)三个步骤,分别对应View中的measure().layout().draw()三个方法 ...

  9. Android 自定义view 的onFinishInflate方法的用法

    Android onFinishInflate 加载完成的意思,意思是: 在 setContentView 之后会调用此方法, 或者 比如自己写的 自定义View :MyView mv = (MyVi ...

  10. android自定义view生命周期,android基础之自定义view

    一.Custom View 1.view的继承关系 view继承关系.png 2.Android 如何绘制试图层次 当activity获取焦点时,它必须提供layout层次的根节点,然后android ...

最新文章

  1. Turing渲染着色器网格技术分析
  2. java线程入门篇(一)
  3. C语言检查列表是否是回文的算法(附完整源码)
  4. [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
  5. android intent传对象,startActivityForResult使用, setResult(RESULT_OK)使用,getArguments(),
  6. 华为云云容器快速搭建网站实践随记—利用私有镜像搭建GuestBook
  7. CSS魔法堂:选择器及其优先级
  8. OpenCV Laplacian 拉普拉斯变换
  9. java集合升序降序
  10. wpsmac历史版本_wps office下载
  11. 苹果电脑python编程里面怎么切到中文_苹果电脑输入法怎么切换到中文
  12. Python根据拼音对中文排序
  13. OSError: [Errno 1] Operation not permitted: '/tmp/pip-g3bg0s-uninstall/System/Library/Frameworks/Pyt
  14. 《笨办法学python》第39课—— 列表的操作
  15. OpenTCS打造移动机器人交通管制系统(五)
  16. 继承 方法重写 组合(尚学堂视频学习总结_003)
  17. windows7添加打印机时,提示“本地打印机后台处理程序服务没有运行”
  18. 第二十四篇:SuperSpeed/HighSpeed USB的ISO传输
  19. SimpleWord 简词开发记录笔记
  20. 数据库修改用友U8账套

热门文章

  1. php规范PSR-3(日志接口)
  2. mysql 登录及常用命令
  3. [LeetCode]50.Pow(x, n)
  4. iframe常用属性知识
  5. div探索系列(二):让多个div显示在一行(浮动的div)
  6. django 开发 - 小心模板文件的编码格式(utf-8)
  7. html点击标签c,html - 标签并以html形式输入点击其他提交按钮(所有浏览器) - 堆栈内存溢出...
  8. python 封装_Python之封装
  9. 30天自制操作系统之叠加处理
  10. html模板引擎 字符串长度,javascript轻量级模板引擎juicer使用指南