am 4b125836
: Merge "Added function to render a drawable in all available states" into lmp-mr1-dev
* commit '4b12583653561f69a5780126485380cac187c478': Added function to render a drawable in all available states
This commit is contained in:
@ -181,7 +181,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
|
|||||||
*/
|
*/
|
||||||
private static LayoutLog sCurrentLog = sDefaultLog;
|
private static LayoutLog sCurrentLog = sDefaultLog;
|
||||||
|
|
||||||
private static final int LAST_SUPPORTED_FEATURE = Features.PREFERENCES_RENDERING;
|
private static final int LAST_SUPPORTED_FEATURE = Features.RENDER_ALL_DRAWABLE_STATES;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getApiLevel() {
|
public int getApiLevel() {
|
||||||
|
@ -22,12 +22,14 @@ import com.android.ide.common.rendering.api.ResourceValue;
|
|||||||
import com.android.ide.common.rendering.api.Result;
|
import com.android.ide.common.rendering.api.Result;
|
||||||
import com.android.ide.common.rendering.api.Result.Status;
|
import com.android.ide.common.rendering.api.Result.Status;
|
||||||
import com.android.layoutlib.bridge.android.BridgeContext;
|
import com.android.layoutlib.bridge.android.BridgeContext;
|
||||||
|
import com.android.layoutlib.bridge.android.RenderParamsFlags;
|
||||||
import com.android.resources.ResourceType;
|
import com.android.resources.ResourceType;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Bitmap_Delegate;
|
import android.graphics.Bitmap_Delegate;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.StateListDrawable;
|
||||||
import android.view.AttachInfo_Accessor;
|
import android.view.AttachInfo_Accessor;
|
||||||
import android.view.View.MeasureSpec;
|
import android.view.View.MeasureSpec;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
@ -37,6 +39,10 @@ import java.awt.Color;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action to render a given Drawable provided through {@link DrawableParams#getDrawable()}.
|
* Action to render a given Drawable provided through {@link DrawableParams#getDrawable()}.
|
||||||
*
|
*
|
||||||
@ -68,11 +74,37 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
|
|||||||
return Status.ERROR_NOT_A_DRAWABLE.createResult();
|
return Status.ERROR_NOT_A_DRAWABLE.createResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Drawable d = ResourceHelper.getDrawable(drawableResource, context);
|
||||||
|
|
||||||
|
final Boolean allStates =
|
||||||
|
params.getFlag(RenderParamsFlags.FLAG_KEY_RENDER_ALL_DRAWABLE_STATES);
|
||||||
|
if (allStates == Boolean.TRUE) {
|
||||||
|
final List<BufferedImage> result;
|
||||||
|
|
||||||
|
if (d instanceof StateListDrawable) {
|
||||||
|
result = new ArrayList<BufferedImage>();
|
||||||
|
final StateListDrawable stateList = (StateListDrawable) d;
|
||||||
|
for (int i = 0; i < stateList.getStateCount(); i++) {
|
||||||
|
final Drawable stateDrawable = stateList.getStateDrawable(i);
|
||||||
|
result.add(renderImage(hardwareConfig, stateDrawable, context));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = Collections.singletonList(renderImage(hardwareConfig, d, context));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status.SUCCESS.createResult(result);
|
||||||
|
} else {
|
||||||
|
BufferedImage image = renderImage(hardwareConfig, d, context);
|
||||||
|
return Status.SUCCESS.createResult(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedImage renderImage(HardwareConfig hardwareConfig, Drawable d,
|
||||||
|
BridgeContext context) {
|
||||||
// create a simple FrameLayout
|
// create a simple FrameLayout
|
||||||
FrameLayout content = new FrameLayout(context);
|
FrameLayout content = new FrameLayout(context);
|
||||||
|
|
||||||
// get the actual Drawable object to draw
|
// get the actual Drawable object to draw
|
||||||
Drawable d = ResourceHelper.getDrawable(drawableResource, context);
|
|
||||||
content.setBackground(d);
|
content.setBackground(d);
|
||||||
|
|
||||||
// set the AttachInfo on the root view.
|
// set the AttachInfo on the root view.
|
||||||
@ -80,8 +112,27 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
|
|||||||
|
|
||||||
|
|
||||||
// measure
|
// measure
|
||||||
int w = hardwareConfig.getScreenWidth();
|
int w = d.getIntrinsicWidth();
|
||||||
int h = hardwareConfig.getScreenHeight();
|
int h = d.getIntrinsicHeight();
|
||||||
|
|
||||||
|
final int screenWidth = hardwareConfig.getScreenWidth();
|
||||||
|
final int screenHeight = hardwareConfig.getScreenHeight();
|
||||||
|
|
||||||
|
if (w == -1 || h == -1) {
|
||||||
|
// Use screen size when either intrinsic width or height isn't available
|
||||||
|
w = screenWidth;
|
||||||
|
h = screenHeight;
|
||||||
|
} else if (w > screenWidth || h > screenHeight) {
|
||||||
|
// If image wouldn't fit to the screen, resize it to avoid cropping.
|
||||||
|
|
||||||
|
// We need to find scale such that scale * w <= screenWidth, scale * h <= screenHeight
|
||||||
|
double scale = Math.min((double) screenWidth / w, (double) screenHeight / h);
|
||||||
|
|
||||||
|
// scale * w / scale * h = w / h, so, proportions are preserved.
|
||||||
|
w = (int) Math.floor(scale * w);
|
||||||
|
h = (int) Math.floor(scale * h);
|
||||||
|
}
|
||||||
|
|
||||||
int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
|
int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
|
||||||
int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
|
int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
|
||||||
content.measure(w_spec, h_spec);
|
content.measure(w_spec, h_spec);
|
||||||
@ -105,8 +156,7 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
|
|||||||
|
|
||||||
// and draw
|
// and draw
|
||||||
content.draw(canvas);
|
content.draw(canvas);
|
||||||
|
return image;
|
||||||
return Status.SUCCESS.createResult(image);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BufferedImage getImage(int w, int h) {
|
protected BufferedImage getImage(int w, int h) {
|
||||||
|
Reference in New Issue
Block a user