From d604ad1ad442790af53847d24060ecb097106d26 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Thu, 20 Aug 2009 14:29:56 -0700 Subject: [PATCH] Support full length rendering. New rendering method in ILayoutBridge to specify whether the rendering height should be the specified height or if it should be the height required by the layout (specified height is always the minimum). --- .../android/layoutlib/api/ILayoutBridge.java | 62 ++++++++++++++++--- .../com/android/layoutlib/bridge/Bridge.java | 48 ++++++++++++-- 2 files changed, 95 insertions(+), 15 deletions(-) diff --git a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java b/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java index df1876d310c48..b069aad4242af 100644 --- a/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java +++ b/tools/layoutlib/api/src/com/android/layoutlib/api/ILayoutBridge.java @@ -24,40 +24,83 @@ import java.util.Map; *

*

{@link #getApiLevel()} gives the ability to know which methods are available. *

+ * Changes in API level 4: + *

* Changes in API level 3: * * Changes in API level 2: * */ public interface ILayoutBridge { - - final int API_CURRENT = 3; + + final int API_CURRENT = 4; /** * Returns the API level of the layout library. * While no methods will ever be removed, some may become deprecated, and some new ones * will appear. *

If calling this method throws an {@link AbstractMethodError}, then the API level - * should be considered to be 1. + * should be considered to be 1. */ int getApiLevel(); /** * Initializes the Bridge object. * @param fontOsLocation the location of the fonts. - * @param enumValueMap map attrName => { map enumFlagName => Integer value }. + * @param enumValueMap map attrName => { map enumFlagName => Integer value }. * @return true if success. * @since 1 */ boolean init(String fontOsLocation, Map> enumValueMap); + /** + * Computes and renders a layout + * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the + * layout file. + * @param projectKey An Object identifying the project. This is used for the cache mechanism. + * @param screenWidth the screen width + * @param screenHeight the screen height + * @param renderFullHeight if true, the rendering will render the full height needed by the + * layout. If the layout needs less than screenHeight then the rendering will + * use screenHeight as the height. + * @param density the density factor for the screen. + * @param xdpi the screen actual dpi in X + * @param ydpi the screen actual dpi in Y + * @param themeName The name of the theme to use. + * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme. + * @param projectResources the resources of the project. The map contains (String, map) pairs + * where the string is the type of the resource reference used in the layout file, and the + * map contains (String, {@link IResourceValue}) pairs where the key is the resource name, + * and the value is the resource value. + * @param frameworkResources the framework resources. The map contains (String, map) pairs + * where the string is the type of the resource reference used in the layout file, and the map + * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the + * value is the resource value. + * @param projectCallback The {@link IProjectCallback} object to get information from + * the project. + * @param logger the object responsible for displaying warning/errors to the user. + * @return an {@link ILayoutResult} object that contains the result of the layout. + * @since 4 + */ + ILayoutResult computeLayout(IXmlPullParser layoutDescription, + Object projectKey, + int screenWidth, int screenHeight, boolean renderFullHeight, + int density, float xdpi, float ydpi, + String themeName, boolean isProjectTheme, + Map> projectResources, + Map> frameworkResources, + IProjectCallback projectCallback, ILayoutLog logger); + /** * Computes and renders a layout * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the @@ -84,6 +127,7 @@ public interface ILayoutBridge { * @return an {@link ILayoutResult} object that contains the result of the layout. * @since 3 */ + @Deprecated ILayoutResult computeLayout(IXmlPullParser layoutDescription, Object projectKey, int screenWidth, int screenHeight, int density, float xdpi, float ydpi, @@ -155,7 +199,7 @@ public interface ILayoutBridge { Map> projectResources, Map> frameworkResources, IProjectCallback projectCallback, ILayoutLog logger); - + /** * Clears the resource cache for a specific project. *

This cache contains bitmaps and nine patches that are loaded from the disk and reused diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index 6e26a05543cc0..02804e82dcab5 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -312,6 +312,7 @@ public final class Bridge implements ILayoutBridge { } /* + * For compatilibty purposes, we implement the old deprecated version of computeLayout. * (non-Javadoc) * @see com.android.layoutlib.api.ILayoutBridge#computeLayout(com.android.layoutlib.api.IXmlPullParser, java.lang.Object, int, int, int, float, float, java.lang.String, boolean, java.util.Map, java.util.Map, com.android.layoutlib.api.IProjectCallback, com.android.layoutlib.api.ILayoutLog) */ @@ -321,6 +322,23 @@ public final class Bridge implements ILayoutBridge { Map> projectResources, Map> frameworkResources, IProjectCallback customViewLoader, ILayoutLog logger) { + return computeLayout(layoutDescription, projectKey, + screenWidth, screenHeight, false /* renderFullHeight */, + density, xdpi, ydpi, themeName, isProjectTheme, + projectResources, frameworkResources, customViewLoader, logger); + } + + /* + * (non-Javadoc) + * @see com.android.layoutlib.api.ILayoutBridge#computeLayout(com.android.layoutlib.api.IXmlPullParser, java.lang.Object, int, int, boolean, int, float, float, java.lang.String, boolean, java.util.Map, java.util.Map, com.android.layoutlib.api.IProjectCallback, com.android.layoutlib.api.ILayoutLog) + */ + public ILayoutResult computeLayout(IXmlPullParser layoutDescription, Object projectKey, + int screenWidth, int screenHeight, boolean renderFullHeight, + int density, float xdpi, float ydpi, + String themeName, boolean isProjectTheme, + Map> projectResources, + Map> frameworkResources, + IProjectCallback customViewLoader, ILayoutLog logger) { if (logger == null) { logger = sDefaultLogger; } @@ -393,15 +411,33 @@ public final class Bridge implements ILayoutBridge { root.setBackgroundDrawable(d); } - int w_spec = MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.EXACTLY); - int h_spec = MeasureSpec.makeMeasureSpec(screenHeight - screenOffset, - MeasureSpec.EXACTLY); - // measure the views + int w_spec = MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.EXACTLY); + int h_spec; + + if (renderFullHeight) { + // measure the full height needed by the layout. + h_spec = MeasureSpec.makeMeasureSpec(screenHeight - screenOffset, + MeasureSpec.UNSPECIFIED); // this lets us know the actual needed size + view.measure(w_spec, h_spec); + + int neededHeight = root.getChildAt(0).getMeasuredHeight(); + + if (neededHeight > screenHeight - screenOffset) { + screenHeight = neededHeight + screenOffset; + } + } + + // remeasure with only the size we need + // This must always be done before the call to layout + h_spec = MeasureSpec.makeMeasureSpec(screenHeight - screenOffset, + MeasureSpec.EXACTLY); view.measure(w_spec, h_spec); + + // now do the layout. view.layout(0, screenOffset, screenWidth, screenHeight); - // draw them + // draw the views Canvas canvas = new Canvas(screenWidth, screenHeight - screenOffset, logger); root.draw(canvas); @@ -1017,7 +1053,7 @@ public final class Bridge implements ILayoutBridge { public void setWallpaperPosition(IBinder window, float x, float y) { // pass for now. } - + public IBinder asBinder() { // pass for now. return null;