Merge pull request #38 from XyLoNaMiyX/master

Add ability to rotate the canvas (closes #32)
This commit is contained in:
Tibor Kaputa 2017-01-14 12:39:30 +01:00 committed by GitHub
commit b0b1becf88
3 changed files with 173 additions and 9 deletions

View File

@ -13,7 +13,7 @@
android:theme="@style/AppTheme">
<activity
android:name=".activities.MainActivity"
android:screenOrientation="portrait">
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

View File

@ -5,7 +5,8 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@ -15,8 +16,8 @@ import java.util.Map;
public class MyCanvas extends View {
private Paint mPaint;
private Path mPath;
private Map<Path, Integer> mPaths;
private MyPath mPath;
private Map<MyPath, Integer> mPaths;
private PathsChangedListener mListener;
private int mColor;
@ -28,7 +29,7 @@ public class MyCanvas extends View {
public MyCanvas(Context context, AttributeSet attrs) {
super(context, attrs);
mPath = new Path();
mPath = new MyPath();
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
@ -50,8 +51,8 @@ public class MyCanvas extends View {
if (mPaths.size() <= 0)
return;
Path lastKey = null;
for (Path key : mPaths.keySet()) {
MyPath lastKey = null;
for (MyPath key : mPaths.keySet()) {
lastKey = key;
}
@ -76,7 +77,7 @@ public class MyCanvas extends View {
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (Map.Entry<Path, Integer> entry : mPaths.entrySet()) {
for (Map.Entry<MyPath, Integer> entry : mPaths.entrySet()) {
mPaint.setColor(entry.getValue());
canvas.drawPath(entry.getKey(), mPaint);
}
@ -117,7 +118,7 @@ public class MyCanvas extends View {
mPaths.put(mPath, mPaint.getColor());
pathsUpdated();
mPath = new Path();
mPath = new MyPath();
}
private void pathsUpdated() {
@ -154,4 +155,69 @@ public class MyCanvas extends View {
public interface PathsChangedListener {
void pathsChanged(int cnt);
}
// Parcelable
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.mPaths = mPaths;
return ss;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if(!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
mPaths = ss.mPaths;
pathsUpdated(); // This doesn't seem to be necessary
}
static class SavedState extends BaseSavedState {
// Members
Map<MyPath, Integer> mPaths;
SavedState(Parcelable superState) {
super(superState);
}
// Save
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(mPaths.size());
for (Map.Entry<MyPath, Integer> entry : mPaths.entrySet()) {
out.writeSerializable(entry.getKey());
out.writeInt(entry.getValue());
}
}
// Load
public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
private SavedState(Parcel in) {
super(in);
int size = in.readInt();
for (int i = 0; i < size; i++) {
MyPath key = (MyPath)in.readSerializable();
int value = in.readInt();
mPaths.put(key, value);
}
}
}
}

View File

@ -0,0 +1,98 @@
package com.simplemobiletools.draw;
import android.graphics.Path;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
// https://stackoverflow.com/a/8127953
class MyPath extends Path implements Serializable {
private List<Action> actions = new LinkedList<>();
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
for (Action action : actions) {
action.perform(this);
}
}
@Override
public void reset() {
actions.clear();
super.reset();
}
@Override
public void moveTo(float x, float y) {
actions.add(new Move(x, y));
super.moveTo(x, y);
}
@Override
public void lineTo(float x, float y) {
actions.add(new Line(x, y));
super.lineTo(x, y);
}
@Override
public void quadTo(float x1, float y1, float x2, float y2) {
actions.add(new Quad(x1, y1, x2, y2));
super.quadTo(x1, y1, x2, y2);
}
private interface Action extends Serializable {
void perform(Path path);
}
private static final class Move implements Action {
private final float x, y;
Move(float x, float y) {
this.x = x;
this.y = y;
}
@Override
public void perform(Path path) {
path.moveTo(x, y);
}
}
private static final class Line implements Action {
private final float x, y;
Line(float x, float y) {
this.x = x;
this.y = y;
}
@Override
public void perform(Path path) {
path.lineTo(x, y);
}
}
private static final class Quad implements Action {
private final float x1, y1, x2, y2;
private Quad(float x1, float y1, float x2, float y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
@Override
public void perform(Path path) {
path.quadTo(x1, y1, x2, y2);
}
}
}