提交 ac1b3454 编写于 作者: H huangziwei

删除CopyColor,完善IPen、IShape定义

上级 8d839c83
......@@ -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) {
return true;
}
......
......@@ -641,7 +641,7 @@ public class GraffitiActivity extends Activity {
mColorContainer.setVisibility(View.VISIBLE);
mTouchGestureListener.setSelectedItem(null);
mGraffiti.setPen(GraffitiPen.COPY);
mGraffiti.setColor(new GraffitiCopyColor(mGraffiti.getBitmap()));
mGraffiti.setColor(new GraffitiColor(mGraffiti.getBitmap()));
mPaintSizeBar.setProgress((int) (DEFAULT_COPY_SIZE * mGraffiti.getSizeUnit()));
}
mDone = true;
......
......@@ -8,14 +8,11 @@ import android.graphics.Shader;
import cn.hzw.graffiti.core.IGraffitiColor;
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 {
COLOR, // 颜色值
......@@ -25,6 +22,7 @@ public class GraffitiColor implements IGraffitiColor{
private int mColor;
private Bitmap mBitmap;
private Type mType;
private Matrix mMatrix;
// bitmap相关
private Shader.TileMode mTileX = Shader.TileMode.MIRROR;
......@@ -36,12 +34,15 @@ public class GraffitiColor implements IGraffitiColor{
}
public GraffitiColor(Bitmap bitmap) {
mType = Type.BITMAP;
mBitmap = bitmap;
this(bitmap, null);
}
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;
mMatrix = matrix;
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
......@@ -54,6 +55,7 @@ public class GraffitiColor implements IGraffitiColor{
paint.setColor(mColor);
} else if (mType == Type.BITMAP) {
BitmapShader shader = new BitmapShader(mBitmap, mTileX, mTileY);
shader.setLocalMatrix(mMatrix);
paint.setShader(shader);
}
}
......@@ -68,13 +70,28 @@ public class GraffitiColor implements IGraffitiColor{
mBitmap = bitmap;
}
public void setColor(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) {
public void setColor(Bitmap bitmap, Matrix matrix) {
mType = Type.BITMAP;
mMatrix = matrix;
mBitmap = bitmap;
}
public void setColor(Bitmap bitmap, Matrix matrix, Shader.TileMode tileX, Shader.TileMode tileY) {
mType = Type.BITMAP;
mBitmap = bitmap;
mMatrix = matrix;
mTileX = tileX;
mTileY = tileY;
}
public void setMatrix(Matrix matrix) {
mMatrix = matrix;
}
public Matrix getMatrix() {
return mMatrix;
}
public int getColor() {
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
} else {
mGraffiti.enableAmplifier(true); // 涂鸦时开启放大镜
// 点击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.setCopying(false);
} else {
......
......@@ -64,8 +64,8 @@ public class GraffitiPath extends GraffitiItemBase {
public static GraffitiPath toShape(IGraffiti graffiti, float sx, float sy, float dx, float dy) {
GraffitiPath path = new GraffitiPath(graffiti);
path.setPen(graffiti.getPen());
path.setShape(graffiti.getShape());
path.setPen(graffiti.getPen().copy());
path.setShape(graffiti.getShape().copy());
path.setSize(graffiti.getSize());
path.setColor(graffiti.getColor().copy());
......@@ -81,8 +81,8 @@ public class GraffitiPath extends GraffitiItemBase {
public static GraffitiPath toPath(IGraffiti graffiti, Path p) {
GraffitiPath path = new GraffitiPath(graffiti);
path.setPen(graffiti.getPen());
path.setShape(graffiti.getShape());
path.setPen(graffiti.getPen().copy());
path.setShape(graffiti.getShape().copy());
path.setSize(graffiti.getSize());
path.setColor(graffiti.getColor().copy());
......@@ -103,6 +103,7 @@ public class GraffitiPath extends GraffitiItemBase {
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setAntiAlias(true);
getPen().config(this, mPaint);
getColor().config(this, mPaint);
getShape().draw(canvas, this, mPaint);
}
......
package cn.hzw.graffiti;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import cn.hzw.graffiti.core.IGraffiti;
import cn.hzw.graffiti.core.IGraffitiItem;
import cn.hzw.graffiti.core.IGraffitiPen;
/**
......@@ -18,6 +21,7 @@ public enum GraffitiPen implements IGraffitiPen {
private boolean mIsSelectable = false; // 画笔绘制的item是否可选
private CopyLocation mCopyLocation;
private Matrix mMatrix;
GraffitiPen() {
this(false);
......@@ -27,6 +31,27 @@ public enum GraffitiPen implements IGraffitiPen {
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是否可选,用于旋转、移动等特定操作
*
......@@ -44,6 +69,7 @@ public enum GraffitiPen implements IGraffitiPen {
synchronized (this) {
if (mCopyLocation == null) {
mCopyLocation = new CopyLocation();
mMatrix = new Matrix();
}
}
}
......@@ -51,9 +77,14 @@ public enum GraffitiPen implements IGraffitiPen {
}
@Override
public void draw(Canvas canvas, IGraffiti graffiti) {
public void drawHelpers(Canvas canvas, IGraffiti graffiti) {
if (this == COPY) {
mCopyLocation.drawItSelf(canvas, graffiti.getSize());
}
}
@Override
public IGraffitiPen copy() {
return this;
}
}
......@@ -4,6 +4,7 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import cn.hzw.graffiti.core.IGraffitiColor;
import cn.hzw.graffiti.core.IGraffitiItem;
import cn.hzw.graffiti.core.IGraffitiShape;
......@@ -61,4 +62,9 @@ public enum GraffitiShape implements IGraffitiShape {
throw new RuntimeException("unknown shape:" + shape);
}
}
@Override
public IGraffitiShape copy() {
return this;
}
}
......@@ -388,7 +388,7 @@ public class GraffitiView extends FrameLayout implements IGraffiti {
}
canvas.restore();
mPen.draw(canvas, this);
mPen.drawHelpers(canvas, this);
}
public float getAllScale() {
......
......@@ -4,16 +4,16 @@ import android.graphics.Paint;
public interface IGraffitiColor {
/**
* 深度拷贝
* @return
*/
public IGraffitiColor copy();
/**
* 配置画笔
* @param graffitiItem
* @param paint
*/
public void config(IGraffitiItem graffitiItem, Paint paint);
/**
* 深度拷贝
* @return
*/
public IGraffitiColor copy();
}
package cn.hzw.graffiti.core;
import android.graphics.Canvas;
import android.graphics.Paint;
public interface IGraffitiPen {
/**
* 配置画笔
* @param graffitiItem
* @param paint
*/
public void config(IGraffitiItem graffitiItem, Paint paint);
/**
* 画笔制作的item是否可选,用于旋转、移动等特定操作
*
* @return
*/
public boolean isSelectable();
/**
* 绘制画笔,由IGraffiti绘制,不属于IGraffitiItem的内容
* 绘制画笔辅助工具,由IGraffiti绘制,不属于IGraffitiItem的内容
* 比如可以用于仿制功能时 定位器的绘制
*
* @param canvas
* @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 {
* @param 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.
先完成此消息的编辑!
想要评论请 注册