提交 ac1b3454 编写于 作者: H huangziwei

删除CopyColor,完善IPen、IShape定义

上级 8d839c83
...@@ -109,7 +109,7 @@ public class CopyLocation { ...@@ -109,7 +109,7 @@ public class CopyLocation {
/** /**
* 判断是否点中 * 判断是否点中
*/ */
public boolean isInIt(float x, float y, float mPaintSize) { public boolean contains(float x, float y, float mPaintSize) {
if ((mX - x) * (mX - x) + (mY - y) * (mY - y) <= mPaintSize * mPaintSize) { if ((mX - x) * (mX - x) + (mY - y) * (mY - y) <= mPaintSize * mPaintSize) {
return true; return true;
} }
......
...@@ -641,7 +641,7 @@ public class GraffitiActivity extends Activity { ...@@ -641,7 +641,7 @@ public class GraffitiActivity extends Activity {
mColorContainer.setVisibility(View.VISIBLE); mColorContainer.setVisibility(View.VISIBLE);
mTouchGestureListener.setSelectedItem(null); mTouchGestureListener.setSelectedItem(null);
mGraffiti.setPen(GraffitiPen.COPY); mGraffiti.setPen(GraffitiPen.COPY);
mGraffiti.setColor(new GraffitiCopyColor(mGraffiti.getBitmap())); mGraffiti.setColor(new GraffitiColor(mGraffiti.getBitmap()));
mPaintSizeBar.setProgress((int) (DEFAULT_COPY_SIZE * mGraffiti.getSizeUnit())); mPaintSizeBar.setProgress((int) (DEFAULT_COPY_SIZE * mGraffiti.getSizeUnit()));
} }
mDone = true; mDone = true;
......
...@@ -8,14 +8,11 @@ import android.graphics.Shader; ...@@ -8,14 +8,11 @@ import android.graphics.Shader;
import cn.hzw.graffiti.core.IGraffitiColor; import cn.hzw.graffiti.core.IGraffitiColor;
import cn.hzw.graffiti.core.IGraffitiItem; import cn.hzw.graffiti.core.IGraffitiItem;
import cn.hzw.graffiti.core.IGraffitiPen;
import cn.hzw.graffiti.util.DrawUtil;
/** /**
* 涂鸦画笔颜色,用于手绘 * 涂鸦画笔颜色,用于手绘
*
*/ */
public class GraffitiColor implements IGraffitiColor{ public class GraffitiColor implements IGraffitiColor {
public enum Type { public enum Type {
COLOR, // 颜色值 COLOR, // 颜色值
...@@ -25,6 +22,7 @@ public class GraffitiColor implements IGraffitiColor{ ...@@ -25,6 +22,7 @@ public class GraffitiColor implements IGraffitiColor{
private int mColor; private int mColor;
private Bitmap mBitmap; private Bitmap mBitmap;
private Type mType; private Type mType;
private Matrix mMatrix;
// bitmap相关 // bitmap相关
private Shader.TileMode mTileX = Shader.TileMode.MIRROR; private Shader.TileMode mTileX = Shader.TileMode.MIRROR;
...@@ -36,12 +34,15 @@ public class GraffitiColor implements IGraffitiColor{ ...@@ -36,12 +34,15 @@ public class GraffitiColor implements IGraffitiColor{
} }
public GraffitiColor(Bitmap bitmap) { public GraffitiColor(Bitmap bitmap) {
mType = Type.BITMAP; this(bitmap, null);
mBitmap = bitmap; }
public GraffitiColor(Bitmap bitmap, Matrix matrix) {
this(bitmap, matrix, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
} }
public GraffitiColor(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) { public GraffitiColor(Bitmap bitmap, Matrix matrix, Shader.TileMode tileX, Shader.TileMode tileY) {
mType = Type.BITMAP; mType = Type.BITMAP;
mMatrix = matrix;
mBitmap = bitmap; mBitmap = bitmap;
mTileX = tileX; mTileX = tileX;
mTileY = tileY; mTileY = tileY;
...@@ -54,6 +55,7 @@ public class GraffitiColor implements IGraffitiColor{ ...@@ -54,6 +55,7 @@ public class GraffitiColor implements IGraffitiColor{
paint.setColor(mColor); paint.setColor(mColor);
} else if (mType == Type.BITMAP) { } else if (mType == Type.BITMAP) {
BitmapShader shader = new BitmapShader(mBitmap, mTileX, mTileY); BitmapShader shader = new BitmapShader(mBitmap, mTileX, mTileY);
shader.setLocalMatrix(mMatrix);
paint.setShader(shader); paint.setShader(shader);
} }
} }
...@@ -68,13 +70,28 @@ public class GraffitiColor implements IGraffitiColor{ ...@@ -68,13 +70,28 @@ public class GraffitiColor implements IGraffitiColor{
mBitmap = bitmap; mBitmap = bitmap;
} }
public void setColor(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) { public void setColor(Bitmap bitmap, Matrix matrix) {
mType = Type.BITMAP; mType = Type.BITMAP;
mMatrix = matrix;
mBitmap = bitmap; mBitmap = bitmap;
}
public void setColor(Bitmap bitmap, Matrix matrix, Shader.TileMode tileX, Shader.TileMode tileY) {
mType = Type.BITMAP;
mBitmap = bitmap;
mMatrix = matrix;
mTileX = tileX; mTileX = tileX;
mTileY = tileY; mTileY = tileY;
} }
public void setMatrix(Matrix matrix) {
mMatrix = matrix;
}
public Matrix getMatrix() {
return mMatrix;
}
public int getColor() { public int getColor() {
return mColor; return mColor;
} }
......
package cn.hzw.graffiti;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import cn.hzw.graffiti.core.IGraffitiColor;
import cn.hzw.graffiti.core.IGraffitiItem;
/**
* 涂鸦画笔颜色,底图为一张图片,可偏移底图位置,用于仿制
*/
public class GraffitiCopyColor implements IGraffitiColor {
// bitmap相关
private Shader.TileMode mTileX = Shader.TileMode.MIRROR;
private Shader.TileMode mTileY = Shader.TileMode.MIRROR; // 镜像
private Bitmap mBitmap;
private Matrix matrix = new Matrix();
public GraffitiCopyColor(Bitmap bitmap) {
this(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
}
public GraffitiCopyColor(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) {
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
}
@Override
public void config(IGraffitiItem item, Paint paint) {
GraffitiItemBase graffitiItem = (GraffitiItemBase) item;
// 根据旋转值获取正确的旋转地图
float transX = 0, transY = 0;
float transXSpan = 0, transYSpan = 0;
if (graffitiItem.getPen() == GraffitiPen.COPY) { // 仿制需要偏移图片
CopyLocation copyLocation = ((GraffitiPath) item).getCopyLocation();
// 仿制时需要偏移图片
if (copyLocation != null) {
transXSpan = copyLocation.getTouchStartX() - copyLocation.getCopyStartX();
transYSpan = copyLocation.getTouchStartY() - copyLocation.getCopyStartY();
}
}
matrix.reset();
matrix.postTranslate(-transX + transXSpan, -transY + transYSpan);
BitmapShader shader = new BitmapShader(mBitmap, mTileX, mTileY);
shader.setLocalMatrix(matrix);
paint.setShader(shader);
}
@Override
public IGraffitiColor copy() {
return new GraffitiCopyColor(mBitmap, mTileX, mTileY);
}
}
...@@ -113,7 +113,7 @@ public class GraffitiOnTouchGestureListener extends TouchGestureDetector.OnTouch ...@@ -113,7 +113,7 @@ public class GraffitiOnTouchGestureListener extends TouchGestureDetector.OnTouch
} else { } else {
mGraffiti.enableAmplifier(true); // 涂鸦时开启放大镜 mGraffiti.enableAmplifier(true); // 涂鸦时开启放大镜
// 点击copy // 点击copy
if (mGraffiti.getPen() == GraffitiPen.COPY && mCopyLocation.isInIt(mGraffiti.toX(mTouchX), mGraffiti.toY(mTouchY), mGraffiti.getSize())) { if (mGraffiti.getPen() == GraffitiPen.COPY && mCopyLocation.contains(mGraffiti.toX(mTouchX), mGraffiti.toY(mTouchY), mGraffiti.getSize())) {
mCopyLocation.setRelocating(true); mCopyLocation.setRelocating(true);
mCopyLocation.setCopying(false); mCopyLocation.setCopying(false);
} else { } else {
......
...@@ -64,8 +64,8 @@ public class GraffitiPath extends GraffitiItemBase { ...@@ -64,8 +64,8 @@ public class GraffitiPath extends GraffitiItemBase {
public static GraffitiPath toShape(IGraffiti graffiti, float sx, float sy, float dx, float dy) { public static GraffitiPath toShape(IGraffiti graffiti, float sx, float sy, float dx, float dy) {
GraffitiPath path = new GraffitiPath(graffiti); GraffitiPath path = new GraffitiPath(graffiti);
path.setPen(graffiti.getPen()); path.setPen(graffiti.getPen().copy());
path.setShape(graffiti.getShape()); path.setShape(graffiti.getShape().copy());
path.setSize(graffiti.getSize()); path.setSize(graffiti.getSize());
path.setColor(graffiti.getColor().copy()); path.setColor(graffiti.getColor().copy());
...@@ -81,8 +81,8 @@ public class GraffitiPath extends GraffitiItemBase { ...@@ -81,8 +81,8 @@ public class GraffitiPath extends GraffitiItemBase {
public static GraffitiPath toPath(IGraffiti graffiti, Path p) { public static GraffitiPath toPath(IGraffiti graffiti, Path p) {
GraffitiPath path = new GraffitiPath(graffiti); GraffitiPath path = new GraffitiPath(graffiti);
path.setPen(graffiti.getPen()); path.setPen(graffiti.getPen().copy());
path.setShape(graffiti.getShape()); path.setShape(graffiti.getShape().copy());
path.setSize(graffiti.getSize()); path.setSize(graffiti.getSize());
path.setColor(graffiti.getColor().copy()); path.setColor(graffiti.getColor().copy());
...@@ -103,6 +103,7 @@ public class GraffitiPath extends GraffitiItemBase { ...@@ -103,6 +103,7 @@ public class GraffitiPath extends GraffitiItemBase {
mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
getPen().config(this, mPaint);
getColor().config(this, mPaint); getColor().config(this, mPaint);
getShape().draw(canvas, this, mPaint); getShape().draw(canvas, this, mPaint);
} }
......
package cn.hzw.graffiti; package cn.hzw.graffiti;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import cn.hzw.graffiti.core.IGraffiti; import cn.hzw.graffiti.core.IGraffiti;
import cn.hzw.graffiti.core.IGraffitiItem;
import cn.hzw.graffiti.core.IGraffitiPen; import cn.hzw.graffiti.core.IGraffitiPen;
/** /**
...@@ -18,6 +21,7 @@ public enum GraffitiPen implements IGraffitiPen { ...@@ -18,6 +21,7 @@ public enum GraffitiPen implements IGraffitiPen {
private boolean mIsSelectable = false; // 画笔绘制的item是否可选 private boolean mIsSelectable = false; // 画笔绘制的item是否可选
private CopyLocation mCopyLocation; private CopyLocation mCopyLocation;
private Matrix mMatrix;
GraffitiPen() { GraffitiPen() {
this(false); this(false);
...@@ -27,6 +31,27 @@ public enum GraffitiPen implements IGraffitiPen { ...@@ -27,6 +31,27 @@ public enum GraffitiPen implements IGraffitiPen {
mIsSelectable = isSelectable; mIsSelectable = isSelectable;
} }
@Override
public void config(IGraffitiItem item, Paint paint) {
GraffitiItemBase graffitiItem = (GraffitiItemBase) item;
if (graffitiItem.getPen() == GraffitiPen.COPY) { // 仿制需要偏移图片
// 根据旋转值获取正确的旋转底图
float transX = 0, transY = 0;
float transXSpan = 0, transYSpan = 0;
CopyLocation copyLocation = ((GraffitiPath) item).getCopyLocation();
// 仿制时需要偏移图片
if (copyLocation != null) {
transXSpan = copyLocation.getTouchStartX() - copyLocation.getCopyStartX();
transYSpan = copyLocation.getTouchStartY() - copyLocation.getCopyStartY();
}
mMatrix.reset();
mMatrix.postTranslate(-transX + transXSpan, -transY + transYSpan);
if (item.getColor() instanceof GraffitiColor) {
((GraffitiColor) item.getColor()).setMatrix(mMatrix);
}
}
}
/** /**
* 画笔制作的item是否可选,用于旋转、移动等特定操作 * 画笔制作的item是否可选,用于旋转、移动等特定操作
* *
...@@ -44,6 +69,7 @@ public enum GraffitiPen implements IGraffitiPen { ...@@ -44,6 +69,7 @@ public enum GraffitiPen implements IGraffitiPen {
synchronized (this) { synchronized (this) {
if (mCopyLocation == null) { if (mCopyLocation == null) {
mCopyLocation = new CopyLocation(); mCopyLocation = new CopyLocation();
mMatrix = new Matrix();
} }
} }
} }
...@@ -51,9 +77,14 @@ public enum GraffitiPen implements IGraffitiPen { ...@@ -51,9 +77,14 @@ public enum GraffitiPen implements IGraffitiPen {
} }
@Override @Override
public void draw(Canvas canvas, IGraffiti graffiti) { public void drawHelpers(Canvas canvas, IGraffiti graffiti) {
if (this == COPY) { if (this == COPY) {
mCopyLocation.drawItSelf(canvas, graffiti.getSize()); mCopyLocation.drawItSelf(canvas, graffiti.getSize());
} }
} }
@Override
public IGraffitiPen copy() {
return this;
}
} }
...@@ -4,6 +4,7 @@ import android.graphics.Canvas; ...@@ -4,6 +4,7 @@ import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF; import android.graphics.PointF;
import cn.hzw.graffiti.core.IGraffitiColor;
import cn.hzw.graffiti.core.IGraffitiItem; import cn.hzw.graffiti.core.IGraffitiItem;
import cn.hzw.graffiti.core.IGraffitiShape; import cn.hzw.graffiti.core.IGraffitiShape;
...@@ -61,4 +62,9 @@ public enum GraffitiShape implements IGraffitiShape { ...@@ -61,4 +62,9 @@ public enum GraffitiShape implements IGraffitiShape {
throw new RuntimeException("unknown shape:" + shape); throw new RuntimeException("unknown shape:" + shape);
} }
} }
@Override
public IGraffitiShape copy() {
return this;
}
} }
...@@ -388,7 +388,7 @@ public class GraffitiView extends FrameLayout implements IGraffiti { ...@@ -388,7 +388,7 @@ public class GraffitiView extends FrameLayout implements IGraffiti {
} }
canvas.restore(); canvas.restore();
mPen.draw(canvas, this); mPen.drawHelpers(canvas, this);
} }
public float getAllScale() { public float getAllScale() {
......
...@@ -4,16 +4,16 @@ import android.graphics.Paint; ...@@ -4,16 +4,16 @@ import android.graphics.Paint;
public interface IGraffitiColor { public interface IGraffitiColor {
/**
* 深度拷贝
* @return
*/
public IGraffitiColor copy();
/** /**
* 配置画笔 * 配置画笔
* @param graffitiItem * @param graffitiItem
* @param paint * @param paint
*/ */
public void config(IGraffitiItem graffitiItem, Paint paint); public void config(IGraffitiItem graffitiItem, Paint paint);
/**
* 深度拷贝
* @return
*/
public IGraffitiColor copy();
} }
package cn.hzw.graffiti.core; package cn.hzw.graffiti.core;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint;
public interface IGraffitiPen { public interface IGraffitiPen {
/**
* 配置画笔
* @param graffitiItem
* @param paint
*/
public void config(IGraffitiItem graffitiItem, Paint paint);
/** /**
* 画笔制作的item是否可选,用于旋转、移动等特定操作 * 画笔制作的item是否可选,用于旋转、移动等特定操作
*
* @return * @return
*/ */
public boolean isSelectable(); public boolean isSelectable();
/** /**
* 绘制画笔,由IGraffiti绘制,不属于IGraffitiItem的内容 * 绘制画笔辅助工具,由IGraffiti绘制,不属于IGraffitiItem的内容
* 比如可以用于仿制功能时 定位器的绘制 * 比如可以用于仿制功能时 定位器的绘制
*
* @param canvas * @param canvas
* @param graffiti * @param graffiti
*/ */
public void draw( Canvas canvas, IGraffiti graffiti); public void drawHelpers(Canvas canvas, IGraffiti graffiti);
/**
* 深度拷贝
* @return
*/
public IGraffitiPen copy();
} }
...@@ -15,4 +15,10 @@ public interface IGraffitiShape { ...@@ -15,4 +15,10 @@ public interface IGraffitiShape {
* @param paint 绘制的画笔 * @param paint 绘制的画笔
*/ */
public void draw(Canvas canvas, IGraffitiItem graffitiItem, Paint paint); public void draw(Canvas canvas, IGraffitiItem graffitiItem, Paint paint);
/**
* 深度拷贝
* @return
*/
public IGraffitiShape copy();
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册