Search in sources :

Example 6 with RenderingMode

use of com.android.ide.common.rendering.api.SessionParams.RenderingMode in project android_frameworks_base by crdroidandroid.

the class RenderSessionImpl method measure.

/**
     * Measures the the current layout if needed (see {@link #invalidateRenderingSize}).
     */
private void measure(@NonNull SessionParams params) {
    // only do the screen measure when needed.
    if (mMeasuredScreenWidth != -1) {
        return;
    }
    RenderingMode renderingMode = params.getRenderingMode();
    HardwareConfig hardwareConfig = params.getHardwareConfig();
    mNewRenderSize = true;
    mMeasuredScreenWidth = hardwareConfig.getScreenWidth();
    mMeasuredScreenHeight = hardwareConfig.getScreenHeight();
    if (renderingMode != RenderingMode.NORMAL) {
        int widthMeasureSpecMode = renderingMode.isHorizExpand() ? // this lets us know the actual needed size
        MeasureSpec.UNSPECIFIED : MeasureSpec.EXACTLY;
        int heightMeasureSpecMode = renderingMode.isVertExpand() ? // this lets us know the actual needed size
        MeasureSpec.UNSPECIFIED : MeasureSpec.EXACTLY;
        // We used to compare the measured size of the content to the screen size but
        // this does not work anymore due to the 2 following issues:
        // - If the content is in a decor (system bar, title/action bar), the root view
        //   will not resize even with the UNSPECIFIED because of the embedded layout.
        // - If there is no decor, but a dialog frame, then the dialog padding prevents
        //   comparing the size of the content to the screen frame (as it would not
        //   take into account the dialog padding).
        // The solution is to first get the content size in a normal rendering, inside
        // the decor or the dialog padding.
        // Then measure only the content with UNSPECIFIED to see the size difference
        // and apply this to the screen size.
        // first measure the full layout, with EXACTLY to get the size of the
        // content as it is inside the decor/dialog
        @SuppressWarnings("deprecation") Pair<Integer, Integer> exactMeasure = measureView(mViewRoot, mContentRoot.getChildAt(0), mMeasuredScreenWidth, MeasureSpec.EXACTLY, mMeasuredScreenHeight, MeasureSpec.EXACTLY);
        // now measure the content only using UNSPECIFIED (where applicable, based on
        // the rendering mode). This will give us the size the content needs.
        @SuppressWarnings("deprecation") Pair<Integer, Integer> result = measureView(mContentRoot, mContentRoot.getChildAt(0), mMeasuredScreenWidth, widthMeasureSpecMode, mMeasuredScreenHeight, heightMeasureSpecMode);
        // now look at the difference and add what is needed.
        if (renderingMode.isHorizExpand()) {
            int measuredWidth = exactMeasure.getFirst();
            int neededWidth = result.getFirst();
            if (neededWidth > measuredWidth) {
                mMeasuredScreenWidth += neededWidth - measuredWidth;
            }
            if (mMeasuredScreenWidth < measuredWidth) {
                // If the screen width is less than the exact measured width,
                // expand to match.
                mMeasuredScreenWidth = measuredWidth;
            }
        }
        if (renderingMode.isVertExpand()) {
            int measuredHeight = exactMeasure.getSecond();
            int neededHeight = result.getSecond();
            if (neededHeight > measuredHeight) {
                mMeasuredScreenHeight += neededHeight - measuredHeight;
            }
            if (mMeasuredScreenHeight < measuredHeight) {
                // If the screen height is less than the exact measured height,
                // expand to match.
                mMeasuredScreenHeight = measuredHeight;
            }
        }
    }
}
Also used : RenderingMode(com.android.ide.common.rendering.api.SessionParams.RenderingMode) HardwareConfig(com.android.ide.common.rendering.api.HardwareConfig)

Aggregations

HardwareConfig (com.android.ide.common.rendering.api.HardwareConfig)6 RenderingMode (com.android.ide.common.rendering.api.SessionParams.RenderingMode)6 Bitmap (android.graphics.Bitmap)1 Canvas (android.graphics.Canvas)1 SessionParams (com.android.ide.common.rendering.api.SessionParams)1 Color (java.awt.Color)1 Graphics2D (java.awt.Graphics2D)1 BufferedImage (java.awt.image.BufferedImage)1