package com.js.photosdk.bodywarp; import com.joysoft.photosdk.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class WarpView extends View { private Bitmap mBmp; private int[] image; private int first = 0; private int[] colorR; private int[] colorG; private int[] colorB; private Bitmap newBmp; private boolean fg = true; private Context context; private static final int DEFAULT_PAINT_FLAGS = Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG; Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS); public static int HWPPQ = 110; public static int MMQFJ = 120; private BodyWarp warp = new BodyWarp(); private int MODE = MMQFJ; public WarpView(Context context) { super(context); } public WarpView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; dest = new RectF(0, 0, 0, 0); } @Override protected void onDraw(Canvas canvas) { if (fg) { int viewWidht = getWidth(); int viewHeight = getHeight(); float scale1 = (float) width / (float) viewWidht; float scale2 = (float) height / (float) viewHeight; scale = scale1 > scale2 ? scale1 : scale2; int xoffset = (viewWidht - (int) (width / scale)) / 2; int yoffset = (viewHeight - (int) (height / scale)) / 2; dest.set(xoffset, yoffset, (int) (width / scale) + xoffset, (int) (height / scale) + yoffset); canvas.drawBitmap(mBmp, null, dest, mPaint); } else { canvas.drawBitmap(newBmp, null, dest, mPaint); } } private double orig_x, orig_y; private double mou_dx, mou_dy; private double max_dist, max_dist_sq; private int width; private int height; private int count = 0; private double mou_dx_norm; private double mou_dy_norm; private float scale; private RectF dest; private double move_x, move_y; private int dist = (int) getResources().getDimension(R.dimen.max_dist); private int line_height = (int) getResources().getDimension( R.dimen.warp_line); @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN : orig_x = event.getX(); orig_y = event.getY(); orig_x = (orig_x - dest.left) * scale; orig_y = (orig_y - dest.top) * scale; break; case MotionEvent.ACTION_MOVE : max_dist = dist * scale; if (event.getAction() != 1) { move_x = event.getX(); move_y = event.getY(); move_x = (move_x - dest.left) * scale; move_y = (move_y - dest.top) * scale; // if(m > 0){ // int i2 = m + -1; // orig_x = (event.getHistoricalX(i2) - dest.left)*scale; // orig_y = (event.getHistoricalY(i2) - dest.top)*scale; // } if (move_x >= 0 && move_y >= 0) { warp.warpPhotoFromC(image, height, width, max_dist, orig_x, orig_y, move_x, move_y); first++; newBmp.setPixels(image, 0, width, 0, 0, width, height); fg = false; } } orig_x = move_x; orig_y = move_y; break; case MotionEvent.ACTION_UP : break; } invalidate(); return true; } public void setWarpBitmap(Bitmap bmp) { fg = true;// 重置标志 first = 0; mBmp = bmp; width = bmp.getWidth(); height = bmp.getHeight(); newBmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); image = new int[width * height]; mBmp.getPixels(image, 0, width, 0, 0, width, height); newBmp.setPixels(image, 0, width, 0, 0, width, height); } public void setMode(int mode) { this.MODE = mode; } /** * 返回处理好的图片 * * @return */ public Bitmap getWrapBitmap() { return newBmp; } }