我的操作大概是这样的:按下一个按键后,我在onKeyDown()中执行了一次view.invalidate()----我在view中重载了ondraw()方法去绘画.
现在我每次按键一下(不是长按),从iew.invalidate()---->view.ondraw()的过程中,花费时间大概是20ms.
但是,当我长按按键的时候,从iew.invalidate()---->view.ondraw()的每一次过程花费会突然增大到150ms左右.有朋友有过类似经验了,请指教.谢谢.

解决方案 »

  1.   

    可能是长按时CPU大部分几率处理你的触摸事件ACTION_MOVE去了。
      

  2.   


    我在长按按键里面是有操作。是操作完成以后才调用 invalidate函数的。从这个函数被调用到进入onDraw函数的时间花费是150ms左右。
      

  3.   


    恩?。。是有这种可能我就想知道有朋友遇到过没不然我只能自己跟下invalidate到ondraw的流程了,看是怎么被影响的。
      

  4.   

    invalidate会使之前canvas上画的东西无效,同样坐等大牛来指导
      

  5.   

    通知我自己跟流程,打每个关键点的时间的log,发现在长按的时候,主要耗时会卡在两个点,,
    (1)ViewRoot::performTraversals()
    (2)KeyboardView::onDraw()---KeyboardView继承与view,其onDraw()函数中耗时操作主要在canvas.drawBitmap(mBuffer, 0, 0, null)。我的具体操作是,通过键盘的方向按键操作 软键盘,我重载了LatinKeyboardView::onDraw(),从而画出当前的选择的某个按键。01-01 00:25:25.310: INFO/IME(759): onKeyDown()_keycode is 22
    01-01 00:25:25.310: INFO/IME(759): invalidate()==========>cost time is 0ms
    01-01 00:25:25.310: INFO/IME(759): ViewRoot::invalidateChild()==========>cost time is 0ms
    01-01 00:25:25.310: INFO/IME(759): ViewRoot::performTraversals()==========>cost time is 1ms
    01-01 00:25:25.310: INFO/IME(759): View::draw()==========>cost time is 2ms
    01-01 00:25:25.310: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 3ms
    01-01 00:25:25.320: INFO/IME(759): View::draw()==========>cost time is 3ms
    01-01 00:25:25.320: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 10ms
    01-01 00:25:25.320: INFO/IME(759): KeyboardView::onDraw()==========>cost time is 10ms
    01-01 00:25:25.330: INFO/IME(759): onDraw()==>enter==========>cost time is 23ms
    01-01 00:25:25.340: INFO/IME(759): onDraw()==>begin draw==========>cost time is 24ms
    01-01 00:25:25.340: INFO/IME(759): onDraw() now lastKeyIndex is 10
    01-01 00:25:25.340: INFO/IME(759): onDraw()==>after draw==========>cost time is 26ms
    01-01 00:25:25.340: INFO/IME(759): onDraw()__finish___这个是 短按的时候的log,从 invalidate到子类的onDraw()完成,在26ms。
    01-01 00:27:39.560: INFO/IME(759): onKeyDown()_keycode is 22
    01-01 00:27:39.560: INFO/IME(759): invalidate()==========>cost time is 0ms
    01-01 00:27:39.560: INFO/IME(759): ViewRoot::invalidateChild()==========>cost time is 0ms
    01-01 00:27:39.560: INFO/IME(759): ViewRoot::performTraversals()==========>cost time is 1ms
    01-01 00:27:39.620: INFO/IME(759): View::draw()==========>cost time is 62ms
    01-01 00:27:39.620: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 62ms
    01-01 00:27:39.620: INFO/IME(759): View::draw()==========>cost time is 63ms
    01-01 00:27:39.620: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 65ms
    01-01 00:27:39.620: INFO/IME(759): KeyboardView::onDraw()==========>cost time is 65ms
    01-01 00:27:39.690: INFO/IME(759): onDraw()==>enter==========>cost time is 136ms
    01-01 00:27:39.720: INFO/IME(759): onDraw()==>begin draw==========>cost time is 164ms
    01-01 00:27:39.720: INFO/IME(759): onDraw() now lastKeyIndex is 15
    01-01 00:27:39.720: INFO/IME(759): onDraw()==>after draw==========>cost time is 165ms
    01-01 00:27:39.720: INFO/IME(759): onDraw()__finish___
    01-01 00:27:39.740: INFO/IME(759): onKeyDown()_keycode is 22
    01-01 00:27:39.740: INFO/IME(759): invalidate()==========>cost time is 0ms
    01-01 00:27:39.740: INFO/IME(759): ViewRoot::invalidateChild()==========>cost time is 0ms
    01-01 00:27:39.760: INFO/IME(759): ViewRoot::performTraversals()==========>cost time is 19ms
    01-01 00:27:39.820: INFO/IME(759): View::draw()==========>cost time is 80ms
    01-01 00:27:39.820: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 81ms
    01-01 00:27:39.820: INFO/IME(759): View::draw()==========>cost time is 81ms
    01-01 00:27:39.820: INFO/IME(759): View::draw() dirtyOpaque is false==========>cost time is 83ms
    01-01 00:27:39.820: INFO/IME(759): KeyboardView::onDraw()==========>cost time is 83ms
    01-01 00:27:39.920: INFO/IME(759): onDraw()==>enter==========>cost time is 180ms
    01-01 00:27:39.920: INFO/IME(759): onDraw()==>begin draw==========>cost time is 180ms
    01-01 00:27:39.920: INFO/IME(759): onDraw() now lastKeyIndex is 16
    01-01 00:27:39.930: INFO/IME(759): onDraw()==>after draw==========>cost time is 190ms
    01-01 00:27:39.930: INFO/IME(759): onDraw()__finish___这是长按的过程中,我截的其中两次按键的log。明显的看出那两个点耗时的增长。是因为长按的时候,cpu的时间片大部分用来处理按键事件了?。。或者说有什么办法可以避开这样的效果?请大家集思广益啊
      

  6.   

    谷歌了下,发现的这篇文章,从标题看应该能解决你的问题 android自定义view–绘制顺序及相关原理