/*******************************************************************************
* Copyright 2012-present Pixate, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
/**
*
*/
package com.pixate.freestyle.pxcomponentkit.view;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import com.pixate.freestyle.cg.shapes.PXShapeDocument;
/**
* Base class for PX drawables.
*/
public abstract class BasePXShapeDrawable extends Drawable {
protected PXShapeDocument scene;
private int minHeight;
private int minWeight;
public BasePXShapeDrawable(int minHeight, int minWeight) {
this.minHeight = minHeight;
this.minWeight = minWeight;
}
public BasePXShapeDrawable() {
}
/*
* (non-Javadoc)
* @see android.graphics.drawable.Drawable#draw(android.graphics.Canvas)
*/
@Override
public void draw(Canvas canvas) {
loadScene();
if (scene != null) {
// Call renderAll that will draw into a Picture for better
// performance.
scene.render(canvas);
}
}
/*
* (non-Javadoc)
* @see android.graphics.drawable.Drawable#setAlpha(int)
*/
@Override
public void setAlpha(int alpha) {
loadScene();
if (scene != null) {
scene.setOpacity(alpha / 255.0F);
}
}
/*
* (non-Javadoc)
* @see android.graphics.drawable.Drawable#setColorFilter(android.graphics.
* ColorFilter)
*/
@Override
public void setColorFilter(ColorFilter cf) {
// not supported
}
/*
* (non-Javadoc)
* @see android.graphics.drawable.Drawable#getOpacity()
*/
@Override
public int getOpacity() {
if (scene == null) {
loadScene();
}
if (scene != null) {
return (int) (scene.getOpacity() * 255);
}
return 0;
}
@Override
protected void onBoundsChange(Rect bounds) {
if (scene == null) {
loadScene();
}
if (scene != null) {
scene.setViewport(new RectF(bounds));
}
}
@Override
public int getMinimumHeight() {
return Math.max(minHeight, super.getMinimumHeight());
}
@Override
public int getMinimumWidth() {
return Math.max(minWeight, super.getMinimumWidth());
}
@Override
public int getIntrinsicHeight() {
if (scene == null) {
loadScene();
}
if (scene != null) {
return (int) Math.max(1, scene.getHeight());
}
return -1;
}
@Override
public int getIntrinsicWidth() {
if (scene == null) {
loadScene();
}
if (scene != null) {
return (int) Math.max(1, scene.getWidth());
}
return -1;
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
// update the scene bounds
if (scene != null) {
scene.setBounds(new RectF(left, top, right, bottom));
}
super.setBounds(left, top, right, bottom);
}
/**
* Reset the drawing scene that this drawable draws. The next call to the
* {@link #draw(Canvas)} will try to recreate this scene.
*/
public void resetScene() {
scene = null;
}
/**
* Returns a {@link PXShapeDocument} to be rendered on the
* {@link #draw(Canvas)} call. A scene may be cashed, or loaded on every
* call.
*
* @return A {@link PXShapeDocument}
*/
public abstract PXShapeDocument loadScene();
}