package at.markushi.ui.action;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Matrix;
import android.os.Parcel;
import android.os.Parcelable;
/**
* A action to be drawn by {@link at.markushi.ui.ActionView}
*/
public class Action implements Parcelable {
// 3 Lines * 4 points each
public static final int ACTION_SIZE = 12;
// combination of x/y positions describing the lines
protected float[] lineData;
protected List<LineSegment> lineSegments = new ArrayList<LineSegment>(3);
protected boolean transformed = false;
protected float size = 1f;
public Action() {
}
public Action(float[] lineData, List<LineSegment> lineSegments) {
this.lineData = lineData;
if (lineSegments != null) {
this.lineSegments.addAll(lineSegments);
}
}
public void transform(float translationX, float translationY, float scale, float size) {
this.size = size;
this.transformed = true;
final Matrix m = new Matrix();
m.preScale(scale, scale);
m.postTranslate(translationX, translationY);
m.mapPoints(lineData);
}
public void flipHorizontally() {
// flip x coordinates
for (int i = 0; i < lineData.length; i += 2) {
lineData[i] = size - lineData[i];
}
// flip line direction
for (int i = 0; i < lineData.length; i += 4) {
float x0 = lineData[i];
float y0 = lineData[i + 1];
lineData[i + 0] = lineData[i + 2];
lineData[i + 1] = lineData[i + 3];
lineData[i + 2] = x0;
lineData[i + 3] = y0;
}
}
public float[] getLineData() {
return lineData;
}
public List<LineSegment> getLineSegments() {
return lineSegments;
}
public void setLineSegments(List<LineSegment> lineSegments) {
this.lineSegments = lineSegments;
}
public boolean isTransformed() {
return transformed;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloatArray(this.lineData);
dest.writeTypedList(lineSegments);
}
private Action(Parcel in) {
this.lineData = in.createFloatArray();
in.readTypedList(lineSegments, LineSegment.CREATOR);
}
public static final Parcelable.Creator<Action> CREATOR = new Parcelable.Creator<Action>() {
public Action createFromParcel(Parcel source) {
return new Action(source);
}
public Action[] newArray(int size) {
return new Action[size];
}
};
}