@Override HardwareLayer getHardwareLayer() { // NOTE: Maintain these two lines very carefully (see View.java) mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID; mPrivateFlags &= ~PFLAG_DIRTY_MASK; if (mLayer == null) { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; } mLayer = mAttachInfo.mHardwareRenderer.createHardwareLayer(mOpaque); if (!mUpdateSurface) { // Create a new SurfaceTexture for the layer. mSurface = mAttachInfo.mHardwareRenderer.createSurfaceTexture(mLayer); } mSurface.setDefaultBufferSize(getWidth(), getHeight()); nCreateNativeWindow(mSurface); mUpdateListener = new SurfaceTexture.OnFrameAvailableListener() { @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { // Per SurfaceTexture's documentation, the callback may be invoked // from an arbitrary thread updateLayer(); if (Looper.myLooper() == Looper.getMainLooper()) { invalidate(); } else { postInvalidate(); } } }; mSurface.setOnFrameAvailableListener(mUpdateListener); if (mListener != null && !mUpdateSurface) { mListener.onSurfaceTextureAvailable(mSurface, getWidth(), getHeight()); } mLayer.setLayerPaint(mLayerPaint); } if (mUpdateSurface) { // Someone has requested that we use a specific SurfaceTexture, so // tell mLayer about it and set the SurfaceTexture to use the // current view size. mUpdateSurface = false; // Since we are updating the layer, force an update to ensure its // parameters are correct (width, height, transform, etc.) updateLayer(); mMatrixChanged = true; mAttachInfo.mHardwareRenderer.setSurfaceTexture(mLayer, mSurface); mSurface.setDefaultBufferSize(getWidth(), getHeight()); } applyUpdate(); applyTransformMatrix(); return mLayer; }