import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import com.xinhuanet.imageutil.R;
import com.xinhuanet.imageutil.util.ImageUtil;
public class FreePuzzleView extends View {
private Bitmap backgroundBitmap = Bitmap
.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.background), 480, 700, false);
Bmp bmp[];
private int size = 0;
public FreePuzzleView(Context context) {
super(context);
// bmp = new Bmp[4];
// {
//
// for (int i = 0; i < 4; i++) {
// bmp[i] = new
Bmp(Bitmap.createScaledBitmap(BitmapFactory
// .decodeStream(getResources().openRawResource(
// R.drawable.ic_launcher)), 240, 240, false), i, i *
50f,
// i * 60f);
// bmp[i].width = bmp[i].getPic().getWidth();
// bmp[i].height = bmp[i].getPic().getWidth();
// }
// }
// this.pic = bmp;
// this.canvas.drawColor(-232432445);
// for (int i = 0; i < 4; i++) {
// tempBitmap = pic[0].findByPiority(pic, i);
// tempBitmap.matrix.preTranslate(
// tempBitmap.getXY(1) - tempBitmap.getWidth() / 2,
// tempBitmap.getXY(2) - tempBitmap.getHeight() / 2);
// this.canvas.drawBitmap(tempBitmap.pic, tempBitmap.matrix,
null);
// }
}
public FreePuzzleView(Context context, Bmp[] pic) {
this(context);
this.pic = pic;
this.canvas.drawColor(-232432445);
this.canvas.drawBitmap(backgroundBitmap, 0, 0, null);
size = pic.length;
for (int i = 0; i < size; i++) {
tempBitmap = pic[0].findByPiority(pic, i);
tempBitmap.getMatrix().preTranslate(
tempBitmap.getXY(1) - tempBitmap.getWidth() / 2,
tempBitmap.getXY(2) - tempBitmap.getHeight() / 2);
this.canvas.drawBitmap(tempBitmap.getPic(),
tempBitmap.getMatrix(),
null);
}
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(canvasBitmap, 0, 0, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (size == 0) {
return true;
}
order(event);
this.X = event.getX();
this.Y = event.getY();
CX = pic[size - 1].findByPiority(pic, size - 1).getXY(1)
- event.getX();
CY = pic[size - 1].findByPiority(pic, size - 1).getXY(2)
- event.getY();
Begin = true;
}
if (event.getAction() == MotionEvent.ACTION_MOVE
&& Begin
&& event.getPointerCount() ==
1) {
if (size == 0) {
return true;
}
this.X = event.getX();
this.Y = event.getY();
this.canvas.drawColor(-232432445);
this.canvas.drawBitmap(backgroundBitmap, 0, 0, null);
for (int i = 0; i < size - 1; i++) {
tempBitmap = pic[0].findByPiority(pic, i);
tempBitmap.getMatrix().preTranslate(0f, 0f);
canvas.drawBitmap(tempBitmap.getPic(),
tempBitmap.getMatrix(),
null);
}
tempBitmap = pic[0].findByPiority(pic, size - 1);
rotalP = rotalPoint(new float[] { this.X, this.Y },
tempBitmap.getPreX(), tempBitmap.getPreY(),
tempBitmap.getWidth() / 2, tempBitmap.getHeight() / 2,
tempBitmap.getMatrix());
if (
// (Math.abs(pic[0].findByPiority(pic, 3).getXY(1) - this.X)
<
// pic[0].findByPiority(pic, 3).getWidth() / 2)
(Math.abs(rotalP[0] - pic[0].findByPiority(pic, size -
1).getXY(1)) < pic[0]
.findByPiority(pic, size - 1).getWidth() / 2)
// &&
(Math.abs(pic[0].findByPiority(pic, 3).getXY(2) - this.Y)
<
// pic[0].findByPiority(pic, 3).getHeight() / 2)
&& (Math.abs(rotalP[1]
- pic[0].findByPiority(pic, size - 1).getXY(2))
< pic[0]
.findByPiority(pic, size - 1).getHeight() / 2)) {
// tempBitmap.matrix.preTranslate(X + CX - tempBitmap.preX, Y
+
// CY - tempBitmap.preY);
// 旋转移动
// tempBitmap.matrix.preRotate(30);
rotalC = this.getT(tempBitmap.getWidth() / 2,
tempBitmap.getHeight() / 2, X + CX, Y + CY,
tempBitmap.getMatrix());
// Log.i("matrix", "the matrix");
// tempBitmap.matrix.setTranslate(T[0], T[1]);
canvas.drawBitmap(tempBitmap.getPic(),
tempBitmap.getMatrix(),
null);
tempBitmap.setPreX(X + CX);
tempBitmap.setPreY(Y + CY);
} else {
tempBitmap.getMatrix().preTranslate(0f, 0f);
canvas.drawBitmap(tempBitmap.getPic(),
tempBitmap.getMatrix(),
null);
}
}
// 多点触控
if (event.getPointerCount() >= 2) {
if (size == 0) {
return true;
}
this.canvas.drawColor(-232432445);
this.canvas.drawBitmap(backgroundBitmap, 0, 0, null);
for (int i = 0; i < size - 1; i++) {
tempBitmap = pic[0].findByPiority(pic, i);
tempBitmap.getMatrix().preTranslate(0f, 0f);
canvas.drawBitmap(tempBitmap.getPic(),
tempBitmap.getMatrix(),
null);
}
tempBitmap = pic[0].findByPiority(pic, size - 1);
rotalP = rotalPoint(new float[] { event.getX(0), event.getY(0)
},
tempBitmap.getPreX(), tempBitmap.getPreY(),
tempBitmap.getWidth() / 2, tempBitmap.getHeight() / 2,
tempBitmap.getMatrix());
rotalP_2 = rotalPoint(new float[] { event.getX(1),
event.getY(1) },
tempBitmap.getPreX(), tempBitmap.getPreY(),
tempBitmap.getWidth() / 2, tempBitmap.getHeight() / 2,
tempBitmap.getMatrix());
if ((Math.abs(rotalP[0]
- pic[0].findByPiority(pic, size - 1).getXY(1))
< pic[0]
.findByPiority(pic, size - 1).getWidth() / 2)
&& (Math.abs(rotalP[1]
- pic[0].findByPiority(pic, size - 1).getXY(2))
< pic[0]
.findByPiority(pic, size - 1).getHeight() / 2)
&& (Math.abs(rotalP_2[0]
- pic[0].findByPiority(pic, size - 1).getXY(1))
< pic[0]
.findByPiority(pic, size - 1).getWidth() / 2)
&& (Math.abs(rotalP_2[1]
- pic[0].findByPiority(pic, size - 1).getXY(2))
< pic[0]
.findByPiority(pic, size - 1).getHeight() / 2)
|| true) {
if (bool) {
preLength = spacing(event);
preCos = cos(event);
bool = false;
}
// 获取角度和长度
length = spacing(event);
cos = cos(event);
// 放大和缩小
if (length - preLength != 0) {
tempBitmap.setWidth(tempBitmap.getWidth()
* (1.0f + (length - preLength) / length));
tempBitmap.setHeight(tempBitmap.getHeight()
* (1.0f + (length - preLength) / length));
// tempBitmap.pic =
Bitmap.createScaledBitmap(BitmapFactory
// .decodeStream(getResources().openRawResource(
// R.drawable.ic_launcher)), (int) tempBitmap.width,
// (int) tempBitmap.height, false);
tempBitmap.setPic(Bitmap.createScaledBitmap(ImageUtil
.zoomPicture(pic[tempBitmap.getOrder()].getPath(),
240 * 240), (int) tempBitmap.getWidth(),
(int) tempBitmap.getHeight(), false));
// Log.i("new Width",
// String.valueOf(pic[0].findByPiority(pic,
// size - 1).getWidth()));
scale(tempBitmap.getWidth() / 2,
tempBitmap.getHeight() / 2, tempBitmap.getPreX(),
tempBitmap.getPreY(), tempBitmap.getMatrix());
}
// 旋转
if (Math.abs(cos) > 3
&& Math.abs(cos) <
177
&& Math.abs(cos - preCos)
< 15) {
tempBitmap.getMatrix().postRotate(cos - preCos);
this.getT(tempBitmap.getWidth() / 2,
tempBitmap.getHeight() / 2, tempBitmap.getPreX(),
tempBitmap.getPreY(), tempBitmap.getMatrix());
}
preCos = cos;
preLength = length;
// this.getT(tempBitmap.width / 2, tempBitmap.height / 2
,
// tempBitmap.preX, tempBitmap.preY, tempBitmap.matrix);
}
// 初始位置
canvas.drawBitmap(tempBitmap.getPic(), tempBitmap.getMatrix(),
null);
// Log.i("preX and preY", String.valueOf(tempBitmap.preX) + "
: "
// + String.valueOf(tempBitmap.preY));
// X_1 = event.getX(0);
// X_2 = event.getX(1);
// Y_1 = event.getY(0);
// Y_2 = event.getY(1);
// Log.i("2 touch ",
String.valueOf(event.getPointerCount()));
// tan = (Y_2 - Y_1) / (X_2 - X_1);
// rotary = (float) Math.atan((double) tan);
// tempBitmap.matrix.setRotate(rotary);
//
// this.canvas.drawColor(-232432445);
// this.canvas.drawBitmap(backgroundBitmap, 0, 0, null);
// for (int i = 0; i < size-1; i++) {
// tempBitmap = pic[0].findByPiority(pic, i);
// tempBitmap.matrix.preTranslate(0f, 0f);
// canvas.drawBitmap(tempBitmap.getPic(), tempBitmap.matrix,
null);
// }
// tempBitmap = pic[0].findByPiority(pic, size-1);
// if ((Math.abs(pic[0].findByPiority(pic, size-1).getXY(1)
-
// this.X_1) < pic[0]
// .findByPiority(pic, size-1).getWidth() / 2)
// &&
(Math.abs(pic[0].findByPiority(pic, size-1).getXY(2)
// - this.Y_1) < pic[0].findByPiority(pic,
size-1)
// .getHeight() / 2)
// &&
(Math.abs(pic[0].findByPiority(pic, size-1).getXY(1)
// - this.X_2) < pic[0].findByPiority(pic,
size-1)
// .getWidth() / 2)
// &&
(Math.abs(pic[0].findByPiority(pic, size-1).getXY(2)
// - this.Y_2) < pic[0].findByPiority(pic,
size-1)
// .getHeight() / 2)) {
// tempBitmap.matrix.preTranslate(X + CX - tempBitmap.preX, Y
+ CY
// - tempBitmap.preY);
// canvas.drawBitmap(tempBitmap.getPic(), tempBitmap.matrix,
null);
//
// tempBitmap.preX = X + CX;
// tempBitmap.preY = Y + CY;
// } else {
// tempBitmap.matrix.preTranslate(0f, 0f);
// canvas.drawBitmap(tempBitmap.getPic(), tempBitmap.matrix,
null);
// }
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (size == 0) {
return true;
}
CX = 0f;
CY = 0f;
Begin = false;
bool = true;
}
invalidate();
return true;
}
public void order(MotionEvent event) {
Bmp temp = null;
for (int i = size - 1; i > -1; i--) {
if ((Math.abs(pic[0].findByPiority(pic, i).getXY(1) -
event.getX()) < pic[0]
.findByPiority(pic, i).getWidth() / 2)
&&
(Math.abs(pic[0].findByPiority(pic, i).getXY(2)
- event.getY()) < pic[0].findByPiority(pic,
i)
.getHeight() / 2)) {
temp = pic[0].findByPiority(pic, i);
for (Bmp bmp : pic) {
if (bmp.getPriority() >
pic[0].findByPiority(pic, i)
.getPriority()) {
bmp.setPriority(bmp.getPriority() - 1);
}
}
temp.setPiority(size - 1);
Begin = true;
return;
}
}
}
public float[] getT(float preX, float preY, float x, float y,
Matrix matrix) {
float[] re = new float[2];
float[] matrixArray = new float[9];
matrix.getValues(matrixArray);
float a = x - preX * matrixArray[0] - preY *
matrixArray[1];
float b = y - preX * matrixArray[3] - preY *
matrixArray[4];
matrixArray[2] = a;
matrixArray[5] = b;
matrix.setValues(matrixArray);
re[0] = a;
re[1] = b;
// Log.i("a", String.valueOf(a));
// Log.i("b", String.valueOf(b));
return re;
}
public float[] rotalPoint(float[] p, float X, float Y, float
width,
float height, Matrix matrix) {
float re[] = new float[2];
float matrixArray[] = new float[9];
matrix.getValues(matrixArray);
float a = p[0] - X;
float b = p[1] - Y;
re[0] = a * matrixArray[0] - b * matrixArray[1] + X;
re[1] = -a * matrixArray[3] + b * matrixArray[4] + Y;
return re;
}
// 计算长度
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
// 计算余弦
private float cos(MotionEvent event) {
// Log.i("XY", String.valueOf(event.getX(0))
// + " " + String.valueOf(event.getY(0))
// + " " + String.valueOf(event.getX(1))
// + " " + String.valueOf(event.getY(1)));
if ((event.getX(0) - event.getX(1)) * (event.getY(0) -
event.getY(1)) > 0) {
return (float) ((float) Math.acos(Math.abs(event.getX(0)
- event.getX(1))
/ spacing(event))
/ Math.PI * 180f);
}
if ((event.getX(0) - event.getX(1)) * (event.getY(0) -
event.getY(1)) < 0) {
return (float) ((float)
Math.acos(-Math.abs(event.getX(0)
- event.getX(1))
/ spacing(event))
/ Math.PI * 180f);
}
if (event.getX(0) - event.getX(1) == 0) {
return (float) 90f;
}
if (event.getY(0) - event.getY(1) == 0) {
return 0f;
}
return 45f;
}
public void scale(float preX, float preY, float x, float y,
Matrix matrix) {
float[] matrixArray = new float[9];
matrix.getValues(matrixArray);
float a = x - preX;
float b = y - preY;
matrixArray[2] = a;
matrixArray[5] = b;
matrix.setValues(matrixArray);
}
public Bitmap getFreePuzzleBitmap() {
return canvasBitmap;
}
private Bitmap canvasBitmap = Bitmap.createBitmap(480,
700,
Config.ARGB_8888);
private Bmp tempBitmap = null;
private Canvas canvas = new Canvas(canvasBitmap);
private float X = 0f;
private float Y = 0f;
@SuppressWarnings("unused")
private float DownX = 0f;
@SuppressWarnings("unused")
private float DownY = 0f;
private Bmp[] pic = new Bmp[4];
// private float X_1;
// private float X_2;
// private float Y_1;
// private float Y_2;
// private float tan;
// private float rotary;
private float CX = 0f;
private float CY = 0f;
private boolean Begin = true;
float rotalC[] = new float[2];
float rotalP[] = new float[2];
float rotalP_2[] = new float[2];
private float preLength = 480.0f;
private float length = 480.0f;
private float preCos = 0f;
private float cos = 0f;
private boolean bool = true;
}