android自由调节图片大小,美图秀秀自由拼图android实现

package com.myView;

import com.androidphoto.unique.R;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Bitmap.Config;

import android.util.FloatMath;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

public class Draw extends View

{

Bmp bmp[];

public Draw(Context

context)

{

super(context);

int len ;

len = 4;

bmp = new Bmp[len];

{

for(int i

= 0; i < len; i++)

{

//  bmp[i] = new

Bmp(BitmapFactory.decodeFile(path[i]), i, i * 50f, i * 60f);

bmp[i] =

new

Bmp(Bitmap.createScaledBitmap(BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.you)),

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);

}

}

@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_UP

event.getAction() ==

MotionEvent.ACTION_POINTER_1_UP

|| event.getAction() ==

MotionEvent.ACTION_POINTER_2_UP)

{

bool = true;

if(twoPoint >

0)

twoPoint --;

}

if(event.getAction() == MotionEvent.ACTION_DOWN

&& event.getPointerCount() == 1)

{

order(event);

this.X = event.getX();

this.Y = event.getY();

CX =

pic[3].findByPiority(pic, 3).getXY(1) - event.getX();

CY =

pic[3].findByPiority(pic, 3).getXY(2) - event.getY();

Begin =

true;

}

if(event.getAction() == MotionEvent.ACTION_MOVE

&& Begin

&& event.getPointerCount() == 1

//&& twoPoint ==

0

)

{

this.X = event.getX();

this.Y = event.getY();

this.canvas.drawColor(-232432445);

for(int i = 0; i

< 3; i++)

{

tempBitmap = pic[0].findByPiority(pic, i);

//  tempBitmap.matrix.preTranslate(0f, 0f);

canvas.drawBitmap(tempBitmap.getPic(),

tempBitmap.matrix, null);

}

tempBitmap =

pic[0].findByPiority(pic, 3);

rotalP = rotalPoint(new

float[]{this.X, this.Y}, tempBitmap.preX, tempBitmap.preY,

tempBitmap.width / 2, tempBitmap.height / 2, tempBitmap.matrix);

if(

(Math.abs(X - pic[0].findByPiority(pic, 3).getXY(1))

< pic[0].findByPiority(pic, 3).getWidth() / 2)

&& (Math.abs(Y -

pic[0].findByPiority(pic, 3).getXY(2)) <

pic[0].findByPiority(pic, 3).getHeight() / 2)

)

{

Log.i("the reeal width",

String.valueOf(tempBitmap.getWidth()));

rotalC = this.getT(tempBitmap.width / 2,

tempBitmap.height / 2 , X + CX, Y + CY, tempBitmap.matrix);

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.getPointerCount() >= 2

&& event.getAction() ==

MotionEvent.ACTION_MOVE)

{

twoPoint = 2;

this.canvas.drawColor(-232432445);

invalidate();

for(int i = 0; i

< 3; i++)

{

tempBitmap = pic[0].findByPiority(pic, i);

this.canvas.drawBitmap(tempBitmap.getPic(),

tempBitmap.matrix, null);

}

tempBitmap =

pic[0].findByPiority(pic, 3);

rotalP = rotalPoint(new

float[]{event.getX(0), event.getY(0)}, tempBitmap.preX,

tempBitmap.preY, tempBitmap.width / 2, tempBitmap.height / 2,

tempBitmap.matrix);

rotalP_2 = rotalPoint(new

float[]{event.getX(1), event.getY(1)}, tempBitmap.preX,

tempBitmap.preY, tempBitmap.width / 2, tempBitmap.height / 2,

tempBitmap.matrix);

if(

(Math.abs(rotalP[0] - pic[0].findByPiority(pic, 3).getXY(1))

< pic[0].findByPiority(pic, 3).width / 2)

&&

(Math.abs(rotalP[1] - pic[0].findByPiority(pic, 3).getXY(2))

< pic[0].findByPiority(pic, 3).height / 2)

&&

(Math.abs(rotalP_2[0] - pic[0].findByPiority(pic, 3).getXY(1))

< pic[0].findByPiority(pic, 3).width / 2)

&&

(Math.abs(rotalP_2[1] - pic[0].findByPiority(pic, 3).getXY(2))

< pic[0].findByPiority(pic, 3).height / 2)

|| true

)

{

if(bool)

{

preLength

= spacing(event);

preCos =

cos(event);

bool =

false;

}

//  获取角度和长度

length = spacing(event);

cos = cos(event);

//  放大和缩小

if(length - preLength != 0)

{

tempBitmap.width *= (1.0f + (length - preLength) / length);

tempBitmap.height *= (1.0f + (length - preLength) / length);

tempBitmap.pic =

Bitmap.createScaledBitmap(BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.you)),

(int)tempBitmap.width, (int) tempBitmap.height, false);

Log.i("new

Width", String.valueOf(pic[0].findByPiority(pic, 3).getWidth()));

scale(tempBitmap.width / 2, tempBitmap.height / 2 ,

tempBitmap.preX, tempBitmap.preY, tempBitmap.matrix);

}

//  旋转

if(Math.abs(cos) > 3

&& Math.abs(cos) <

177 && Math.abs(cos - preCos)

< 15)

{

tempBitmap.matrix.postRotate(cos - preCos);

this.getT(tempBitmap.width / 2, tempBitmap.height / 2 ,

tempBitmap.preX, tempBitmap.preY, tempBitmap.matrix);

}

preCos = cos;

preLength = length;

//  this.getT(tempBitmap.width / 2, tempBitmap.height

/ 2 , tempBitmap.preX, tempBitmap.preY, tempBitmap.matrix);

}

//  初始位置

canvas.drawBitmap(tempBitmap.getPic(), tempBitmap.matrix, null);

Log.i("preX and preY",

String.valueOf(tempBitmap.preX) + " : " +

String.valueOf(tempBitmap.preY));

}

if(event.getAction() == MotionEvent.ACTION_UP)

{

CX = 0f;

CY = 0f;

Begin = false;

}

invalidate();

Log.i("preX and preY", String.valueOf(tempBitmap.preX) + " : " +

String.valueOf(tempBitmap.preY));

return

true;

}

public void

order(MotionEvent event)

{

Bmp temp = null;

for(int i = 3; i > -1; i--)

{

rotalP = rotalPoint(new

float[]{event.getX(), event.getY()}, pic[0].findByPiority(pic,

i).preX, pic[0].findByPiority(pic, i).preY,

pic[0].findByPiority(pic, i).width / 2, pic[0].findByPiority(pic,

i).height / 2, pic[0].findByPiority(pic, i).matrix);

if(

(Math.abs(pic[0].findByPiority(pic, i).getXY(1)

- rotalP[0]) < pic[0].findByPiority(pic, i).width /

2)

&&

(Math.abs(pic[0].findByPiority(pic, i).getXY(2) - rotalP[1])

< pic[0].findByPiority(pic, i).height / 2)

)

{

temp =

pic[0].findByPiority(pic, i);

for(Bmp bmp: pic)

{

if(bmp.getPriority() >

pic[0].findByPiority(pic, i).getPriority())

{

bmp.priority--;

}

}

temp.setPiority(3);

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;

return re;

}

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 void

setToO(Matrix matrix)

{

float[] matrixArray = new float[9];

matrix.getValues(matrixArray);

float a = 0f;

float b = 0f;

matrixArray[2] = a;

matrixArray[5] = b;

matrix.setValues(matrixArray);

}

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;

}

private Bitmap

canvasBitmap = Bitmap.createBitmap(480, 500, 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 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];

int twoPoint = 0;

private float preLength

= 480.0f;

private float length =

480.0f;

private float preCos =

0f;

private float cos = 0f;

private boolean bool =

true;

}

//  @param pic:the Bitmap to draw

//  @param piority: the order to draw picture

//  @param preX,preY: the X and Y

class Bmp

{

//  构造器

public Bmp(Bitmap pic,

int piority)

{

this.pic = pic;

this.priority = piority;

}

//  构造器

public Bmp(Bitmap pic,

int priority, float preX, float preY)

{

this(pic, priority);

this.preX = preX + pic.getWidth() / 2 * 1.5f;

this.preY = preY + pic.getHeight() / 2 * 1.5f;

}

//  findPiority

public Bmp

findByPiority(Bmp[] pic, int priority)

{

for(Bmp p : pic)

{

if(p.priority == priority)

{

return p;

}

}

return null;

}

//  set Priority

public void

setPiority(int priority)

{

this.priority = priority;

}

//  return Priority

public int getPriority()

{

return this.priority;

}

//  return X and Y

public float getXY(int

i)

{

if(i == 1)

{

return

this.preX;

}

else if(i == 2)

{

return

this.preY;

}

return (Float) null;

}

//  getPicture

public Bitmap getPic()

{

return this.pic;

}

//  getWidth

public float getWidth()

{

return width;

}

//  getHeight

public float getHeight()

{

return height;

}

float preX = 0;

float preY = 0;

float width = 0;

float height = 0;

Bitmap pic = null;

int priority = 0;

Matrix matrix = new

Matrix();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值