android怎实现拼图功能,Android 拼图功能的实现(类似于美图秀秀)

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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值