package cn.androidy.thinking.game.pintu;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;
public class JigsawLay {
private float mLeft;
private float mTop;
private float mWidth;
private float mHeight;
private Bitmap bitmap;
private PaintHolder paintHolder;
private Paint blankPaint;
private BitmapShader shader;
private int row;
private int col;
private JigsawConfig config;
private boolean isBlank = false;
public JigsawLay(Bitmap source, JigsawConfig config, int row, int col) {
super();
/**
* 大图的高
*/
int h = source.getHeight();
/**
* 大图的宽
*/
int w = source.getWidth();
/**
* config 是对魔板参数的简单包装,包括多少行、多少列等。这里是4行4列
*/
this.config = config;
/**
* 单元格的长与宽
*/
mWidth = 1.0f * w / config.getColCount();
mHeight = 1.0f * h / config.getRowCount();
this.col = col;
this.row = row;
/**
* 单元格左上角在View的canvas中的坐标
*/
mLeft = mWidth * col;
mTop = mHeight * row;
/**
* 绘制单元格,取大图中相应位置的图片创建出画笔的着色器,用于绘制单元格到画布中
*/
bitmap = Bitmap.createBitmap(source, (int) (mLeft), (int) (mTop), (int) (mWidth), (int) (mHeight));
/**
* TileMode.REPEAT为平铺重复模式
*/
shader = new BitmapShader(bitmap, BitmapShader.TileMode.REPEAT, BitmapShader.TileMode.REPEAT);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);
/**
* paintHolder是为了交换当前单元格和空白单元格
*/
paintHolder = new PaintHolder(paint, this);
/**
* 用于绘制空白单元格
*/
blankPaint = new Paint();
blankPaint.setColor(0xffffffff);
}
public void exchangePaintAndPivot(JigsawLay jigsawLay) {
boolean tempBlank = jigsawLay.isBlank();
jigsawLay.setBlank(isBlank());
setBlank(tempBlank);
PaintHolder tempPaint = jigsawLay.getPaintHolder();
jigsawLay.setPaintHolder(paintHolder);
setPaintHolder(tempPaint);
}
public Bitmap getBitmap() {
return bitmap;
}
/**
* 绘制单元格
*
* @param canvas
*/
public void draw(Canvas canvas) {
RectF rectf;
int left = (int) (mLeft + 2);
int top = (int) (mTop + 2);
int right = (int) (left + mWidth - 4);
int bottom = (int) (top + mHeight - 5);
if (row == config.getRowCount() - 1) {
rectf = new RectF(left, top, right, bottom);
} else {
rectf = new RectF(left, top, right, bottom + 1);
}
if (isBlank) {
/**
* 空白单元格
*/
canvas.drawRoundRect(rectf, 12, 12, blankPaint);
} else {
/**
* 图片单元格,为了使图片看起来不会太生硬,对单元格进行了圆角处理
*/
canvas.drawRoundRect(rectf, 12, 12, paintHolder.getPaint());
}
}
public void setBlank(boolean b) {
isBlank = b;
}
public boolean isBlank() {
return isBlank;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
public void setRow(int row) {
this.row = row;
}
public void setCol(int col) {
this.col = col;
}
public void onTouchEvent(MotionEvent event, OnLayTouchedListener listener, View v) {
boolean isTouched = isTouched(event);
if (isTouched && !isBlank) {
if (listener != null) {
listener.onTouched(this, v);
}
} else {
}
}
public PaintHolder getPaintHolder() {
return paintHolder;
}
public void setPaintHolder(PaintHolder paintHolder) {
this.paintHolder = paintHolder;
}
private boolean isTouched(MotionEvent event) {
// 得到触点的位置
float x = event.getX();
float y = event.getY();
if (y > mTop && y < mTop + mHeight && x > mLeft && x < mLeft + mWidth) {
return true;
}
return false;
}
public float getWidth() {
return mWidth;
}
public float getHeight() {
return mHeight;
}
public float getLeft() {
return mLeft;
}
public float getTop() {
return mTop;
}
public void setLeft(float mLeft) {
this.mLeft = mLeft;
}
public void setTop(float mTop) {
this.mTop = mTop;
}
}