Exemple #1
0
  @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;
  }