Skip to content

Commit

Permalink
图片合成类 代码优化
Browse files Browse the repository at this point in the history
  • Loading branch information
siwangqishiq committed Aug 14, 2016
1 parent fac0d2e commit d49d23f
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 160 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
* 图片编辑 主页面
*
* @author panyi
* <p/>
* <p>
* 包含 1.贴图 2.滤镜 3.剪裁 4.底图旋转 功能
*/
public class EditImageActivity extends BaseActivity {
Expand Down Expand Up @@ -150,7 +150,9 @@ public void onFling(MotionEvent e1, MotionEvent e2, float velocityX, float veloc
* 关闭输入法
*/
private void closeInputMethod() {
mAddTextFragment.hideInput();
if (mAddTextFragment.isAdded()) {
mAddTextFragment.hideInput();
}
}

/**
Expand Down Expand Up @@ -277,6 +279,9 @@ public void onClick(View v) {
case MODE_ROTATE:// 旋转图片保存
mRotateFragment.saveRotateImage();
break;
case MODE_TEXT://文字贴图 图片保存
mAddTextFragment.saveTextImage();
break;
default:
break;
}// end switch
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.xinlan.imageeditlibrary.editimage.fragment;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
Expand Down Expand Up @@ -125,7 +127,7 @@ private void changeTextColor(int newColor) {
}

public void hideInput() {
if (getActivity().getCurrentFocus() != null && isInputMethodShow()) {
if (getActivity() != null && getActivity().getCurrentFocus() != null && isInputMethodShow()) {
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
Expand Down Expand Up @@ -166,5 +168,20 @@ public void onShow() {
activity.bannerFlipper.showNext();

mTextStickerView.setVisibility(View.VISIBLE);
mInputText.clearFocus();
}

/**
* 保存贴图图片
*/
public void saveTextImage() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}

mTextStickerView.clearTextContent();
mTextStickerView.resetView();
}
}// end class
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import com.xinlan.imageeditlibrary.editimage.adapter.StickerAdapter;
import com.xinlan.imageeditlibrary.editimage.adapter.StickerTypeAdapter;
import com.xinlan.imageeditlibrary.editimage.model.StickerBean;
import com.xinlan.imageeditlibrary.editimage.task.StickerTask;
import com.xinlan.imageeditlibrary.editimage.utils.BitmapUtils;
import com.xinlan.imageeditlibrary.editimage.utils.Matrix3;
import com.xinlan.imageeditlibrary.editimage.view.StickerItem;
import com.xinlan.imageeditlibrary.editimage.view.StickerView;
Expand Down Expand Up @@ -62,6 +64,8 @@ public class StirckerFragment extends Fragment {
private LoadStickersTask mLoadStickersTask;
private List<StickerBean> stickerBeanList = new ArrayList<StickerBean>();

private SaveStickersTask mSaveTask;

public static StirckerFragment newInstance(EditImageActivity activity) {
StirckerFragment fragment = new StirckerFragment();
fragment.activity = activity;
Expand Down Expand Up @@ -256,63 +260,25 @@ public void backToMain() {
*
* @author panyi
*/
private final class SaveStickersTask extends
AsyncTask<Bitmap, Void, Bitmap> {
private Dialog dialog;
private final class SaveStickersTask extends StickerTask {
public SaveStickersTask(EditImageActivity activity) {
super(activity);
}

@Override
protected Bitmap doInBackground(Bitmap... params) {
// System.out.println("保存贴图!");
Matrix touchMatrix = activity.mainImage.getImageViewMatrix();

Bitmap resultBit = Bitmap.createBitmap(params[0]).copy(
Bitmap.Config.RGB_565, true);
Canvas canvas = new Canvas(resultBit);

float[] data = new float[9];
touchMatrix.getValues(data);// 底部图片变化记录矩阵原始数据
Matrix3 cal = new Matrix3(data);// 辅助矩阵计算类
Matrix3 inverseMatrix = cal.inverseMatrix();// 计算逆矩阵
Matrix m = new Matrix();
m.setValues(inverseMatrix.getValues());

public void handleImage(Canvas canvas, Matrix m) {
LinkedHashMap<Integer, StickerItem> addItems = mStickerView.getBank();
for (Integer id : addItems.keySet()) {
StickerItem item = addItems.get(id);
item.matrix.postConcat(m);// 乘以底部图片变化矩阵
canvas.drawBitmap(item.bitmap, item.matrix, null);
}// end for
saveBitmap(resultBit, activity.saveFilePath);
return resultBit;
}

@Override
protected void onCancelled() {
super.onCancelled();
dialog.dismiss();
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCancelled(Bitmap result) {
super.onCancelled(result);
dialog.dismiss();
}

@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
public void onPostResult(Bitmap result) {
mStickerView.clear();
activity.changeMainBitmap(result);
dialog.dismiss();
}

@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = BaseActivity.getLoadingDialog(getActivity(), "图片合成保存中...",
false);
dialog.show();
}
}// end inner class

Expand All @@ -321,31 +287,10 @@ protected void onPreExecute() {
*/
public void saveStickers() {
// System.out.println("保存 合成图片");
SaveStickersTask task = new SaveStickersTask();
task.execute(activity.mainBitmap);
}

/**
* 保存Bitmap图片到指定文件
*
* @param bm
* @param name
*/
public static void saveBitmap(Bitmap bm, String filePath) {
File f = new File(filePath);
if (f.exists()) {
f.delete();
}
try {
FileOutputStream out = new FileOutputStream(f);
bm.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
if (mSaveTask != null) {
mSaveTask.cancel(true);
}
// System.out.println("保存文件--->" + f.getAbsolutePath());
mSaveTask = new SaveStickersTask((EditImageActivity) getActivity());
mSaveTask.execute(activity.mainBitmap);
}
}// end class
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.xinlan.imageeditlibrary.editimage.task;

import android.annotation.TargetApi;
import android.app.Dialog;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.AsyncTask;
import android.os.Build;

import com.xinlan.imageeditlibrary.editimage.EditImageActivity;
import com.xinlan.imageeditlibrary.editimage.utils.BitmapUtils;
import com.xinlan.imageeditlibrary.editimage.utils.Matrix3;

/**
* Created by panyi on 2016/8/14.
* <p/>
* 贴图合成任务 抽象类
*/
public abstract class StickerTask extends AsyncTask<Bitmap, Void, Bitmap> {
private Dialog dialog;

private EditImageActivity mContext;

public StickerTask(EditImageActivity activity) {
this.mContext = activity;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = mContext.getLoadingDialog(mContext, "图片合成保存中...",
false);
dialog.show();
}

@Override
protected Bitmap doInBackground(Bitmap... params) {
// System.out.println("保存贴图!");
Matrix touchMatrix = mContext.mainImage.getImageViewMatrix();

Bitmap resultBit = Bitmap.createBitmap(params[0]).copy(
Bitmap.Config.RGB_565, true);
Canvas canvas = new Canvas(resultBit);

float[] data = new float[9];
touchMatrix.getValues(data);// 底部图片变化记录矩阵原始数据
Matrix3 cal = new Matrix3(data);// 辅助矩阵计算类
Matrix3 inverseMatrix = cal.inverseMatrix();// 计算逆矩阵
Matrix m = new Matrix();
m.setValues(inverseMatrix.getValues());

handleImage(canvas, m);

BitmapUtils.saveBitmap(resultBit, mContext.saveFilePath);
return resultBit;
}

@Override
protected void onCancelled() {
super.onCancelled();
dialog.dismiss();
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCancelled(Bitmap result) {
super.onCancelled(result);
dialog.dismiss();
}

@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
onPostResult(result);
dialog.dismiss();
}

public abstract void handleImage(Canvas canvas, Matrix m);

public abstract void onPostResult(Bitmap result);
}//end class
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
Expand Down Expand Up @@ -342,4 +343,98 @@ public static Bitmap getViewBitmap(View view) {
return bitmap;
}

/**
* 保存Bitmap图片到指定文件
*
* @param bm
*/
public static void saveBitmap(Bitmap bm, String filePath) {
File f = new File(filePath);
if (f.exists()) {
f.delete();
}
try {
FileOutputStream out = new FileOutputStream(f);
bm.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// System.out.println("保存文件--->" + f.getAbsolutePath());
}


/**
* Resize a bitmap object to fit the passed width and height
*
* @param input
* The bitmap to be resized
* @param destWidth
* Desired maximum width of the result bitmap
* @param destHeight
* Desired maximum height of the result bitmap
* @return A new resized bitmap
* @throws OutOfMemoryError
* if the operation exceeds the available vm memory
*/
public static Bitmap resizeBitmap( final Bitmap input, int destWidth, int destHeight, int rotation ) throws OutOfMemoryError {

int dstWidth = destWidth;
int dstHeight = destHeight;
final int srcWidth = input.getWidth();
final int srcHeight = input.getHeight();

if ( rotation == 90 || rotation == 270 ) {
dstWidth = destHeight;
dstHeight = destWidth;
}

boolean needsResize = false;
float p;
if ( ( srcWidth > dstWidth ) || ( srcHeight > dstHeight ) ) {
needsResize = true;
if ( ( srcWidth > srcHeight ) && ( srcWidth > dstWidth ) ) {
p = (float) dstWidth / (float) srcWidth;
dstHeight = (int) ( srcHeight * p );
} else {
p = (float) dstHeight / (float) srcHeight;
dstWidth = (int) ( srcWidth * p );
}
} else {
dstWidth = srcWidth;
dstHeight = srcHeight;
}

if ( needsResize || rotation != 0 ) {
Bitmap output;

if ( rotation == 0 ) {
output = Bitmap.createScaledBitmap( input, dstWidth, dstHeight, true );
} else {
Matrix matrix = new Matrix();
matrix.postScale( (float) dstWidth / srcWidth, (float) dstHeight / srcHeight );
matrix.postRotate( rotation );
output = Bitmap.createBitmap( input, 0, 0, srcWidth, srcHeight, matrix, true );
}
return output;
} else
return input;
}


/**
* Resize a bitmap
*
* @param input
* @param destWidth
* @param destHeight
* @return
* @throws OutOfMemoryError
*/
public static Bitmap resizeBitmap( final Bitmap input, int destWidth, int destHeight ) throws OutOfMemoryError {
return resizeBitmap( input, destWidth, destHeight, 0 );
}
}
Loading

0 comments on commit d49d23f

Please sign in to comment.