Android图形学习--从view的invalidate认识刷新VSYNC

参考资料:

DJLZPP

AndroidQ 图形系统(11)UI刷新,SurfaceFlinger,Vsync机制总结_DJLZPP的博客-CSDN博客

在以前的学习中,通过GraphicBuffer的传送和数据读写了解到数据的传送显示流程,没有涉及到画面的刷新,这里通过view的刷新来学习一下,

在GLSurfaceView中,相关onDrawFrame方法会随着屏幕刷新而调用起来。

在普通的view里面,通过调用invalidate方法来注册vsync信号,开始一帧画面的绘制,调用到onDraw方法。invalidate这个方法名字很奇怪,如果是pre-draw似乎好理解一些,也许是想表达当前画面失效的意思吧,invalidate是个理解的关键点,如同GraphicBuffer一样

DJLZPP同学的这个图很好,(借用一下,原文链接在上面)

Android图形学习--从view的invalidate认识刷新VSYNC_第1张图片

没有做过app的可能对invalidate并不熟悉,PointerLocationView中绘制touch轨迹的时候,就使用了invalidate来进行刷新,手指滑动的时候调用,来刷新画面

527    public void onPointerEvent(MotionEvent event) {
528        final int action = event.getAction();
529        int NP = mPointers.size();
530
531        if (action == MotionEvent.ACTION_DOWN
532                || (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN) {
533            final int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
534                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for down
535            if (action == MotionEvent.ACTION_DOWN) {
536                for (int p=0; p> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for UP
632
633            final int id = event.getPointerId(index);
634            if (id >= NP) {
635                Slog.wtf(TAG, "Got pointer ID out of bounds: id=" + id + " arraysize="
636                        + NP + " pointerindex=" + index
637                        + " action=0x" + Integer.toHexString(action));
638                return;
639            }
640            final PointerState ps = mPointers.get(id);
641            ps.mCurDown = false;
642
643            if (action == MotionEvent.ACTION_UP
644                    || action == MotionEvent.ACTION_CANCEL) {
645                mCurDown = false;
646                mCurNumPointers = 0;
647            } else {
648                mCurNumPointers -= 1;
649                if (mActivePointerId == id) {
650                    mActivePointerId = event.getPointerId(index == 0 ? 1 : 0);
651                }
652                ps.addTrace(Float.NaN, Float.NaN, false);
653            }
654        }
655
656        invalidate();
657    }
658

 

你可能感兴趣的:(Android显示系统,Android,android)