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);}}@Overridepublic void onDraw(Canvas canvas){super.onDraw(canvas);canvas.drawBitmap(canvasBitmap, 0, 0, null);}@Overridepublic 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;}//findPioritypublic Bmp findByPiority(Bmp[] pic, int priority){for(Bmp p : pic){if(p.priority == priority){return p;}}return null;}//set Prioritypublic void setPiority(int priority){this.priority = priority;}//return Prioritypublic int getPriority(){return this.priority;}//return X and Ypublic float getXY(int i){if(i == 1){return this.preX;}else if(i == 2){return this.preY;}return (Float) null;}//getPicturepublic Bitmap getPic(){return this.pic;}//getWidthpublic float getWidth(){return width;}//getHeightpublic 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();}


更多相关文章

  1. Android - TextView限制文本长度,英文占1位,中文占2位
  2. TextView 的设置现实的文字的长度?
  3. android TextView设置字过多长长度后面显示省略号失效
  4. 安卓中TextView显示长度的控制
  5. Android中设定EditText的输入长度
  6. android 修改properties属性最大长度
  7. 【Android】TextView的文字长度测量及各种padding解析
  8. 设置TextView超过一定长度后显示省略号

随机推荐

  1. uiautomator快速获取android画面UI元素
  2. Android(安卓)Ble从模式(Peripheral)开发
  3. Android(安卓)带清除功能的输入框控件Edi
  4. react native 错误:Make sure you have an
  5. 链接:NFC:NFC基础
  6. Android(安卓)Handler主线程和一般线程通
  7. Android(安卓)Layout标签之 - viewStub,re
  8. 如何检测 Android(安卓)Cursor 泄漏
  9. Android(安卓)Popup特效
  10. Android中Notification的用法汇总