package com.kaixin.android.activity;
import java.io.IOException;
import java.util.LinkedList;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import com.kaixin.android.KXActivity;
import com.kaixin.android.R;
import com.kaixin.android.ui.base.FaceImage;
import com.kaixin.android.ui.base.FaceImageView;
import com.kaixin.android.utils.PhotoUtil;
/**
* 图片表情类
*
* @author gyz
*
*/
public class ImageFilterFaceActivity extends KXActivity {
private Button mCancel;
private Button mDetermine;
private RelativeLayout mDisplayLayout;
private static FaceImageView mDisplay;
private ImageButton mFace_1;
private ImageButton mFace_2;
private ImageButton mFace_3;
private ImageButton mFace_4;
private ImageButton mFace_5;
private ImageButton mFace_6;
private ImageButton mFace_7;
private ImageButton mFace_8;
private ImageButton mFace_9;
private ImageButton mFace_10;
private ImageButton mFace_11;
private ImageButton mFace_12;
private ImageButton mFace_13;
private ImageButton mFace_14;
private String mPath;// 图片的地址
private static Bitmap mOldBitmap;// 旧图片
private static Bitmap mNewBitmap;// 新图片
private Bitmap mFaceBitmap; // 表情图片
private int mFaceId = 0;// 表情编号
private boolean mIsMeasured;// 是否已经计算大小
private float mMaxWidth;// 图片最大宽度
private float mMaxHeight;// 图片最大高度
private static RectF rectF;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.imagefilter_face_activity);
findViewById();
setListener();
// 获取RelativeLayout的高度和宽度
ViewTreeObserver vto = mDisplayLayout.getViewTreeObserver();
vto.addOnPreDrawListener(new OnPreDrawListener() {
public boolean onPreDraw() {
if (mIsMeasured == false) {
mMaxWidth = mDisplayLayout.getMeasuredWidth();
mMaxHeight = mDisplayLayout.getMeasuredHeight();
init();
mIsMeasured = true;
}
return true;
}
});
}
private void findViewById() {
mCancel = (Button) findViewById(R.id.imagefilter_face_cancel);
mDetermine = (Button) findViewById(R.id.imagefilter_face_determine);
mDisplayLayout = (RelativeLayout) findViewById(R.id.imagefilter_face_display_layout);
mDisplay = (FaceImageView) findViewById(R.id.imagefilter_face_display);
mFace_1 = (ImageButton) findViewById(R.id.imagefilter_face_face1);
mFace_2 = (ImageButton) findViewById(R.id.imagefilter_face_face2);
mFace_3 = (ImageButton) findViewById(R.id.imagefilter_face_face3);
mFace_4 = (ImageButton) findViewById(R.id.imagefilter_face_face4);
mFace_5 = (ImageButton) findViewById(R.id.imagefilter_face_face5);
mFace_6 = (ImageButton) findViewById(R.id.imagefilter_face_face6);
mFace_7 = (ImageButton) findViewById(R.id.imagefilter_face_face7);
mFace_8 = (ImageButton) findViewById(R.id.imagefilter_face_face8);
mFace_9 = (ImageButton) findViewById(R.id.imagefilter_face_face9);
mFace_10 = (ImageButton) findViewById(R.id.imagefilter_face_face10);
mFace_11 = (ImageButton) findViewById(R.id.imagefilter_face_face11);
mFace_12 = (ImageButton) findViewById(R.id.imagefilter_face_face12);
mFace_13 = (ImageButton) findViewById(R.id.imagefilter_face_face13);
mFace_14 = (ImageButton) findViewById(R.id.imagefilter_face_face14);
}
private void setListener() {
mCancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 返回对话框
backDialog();
}
});
mDetermine.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 如果id为0,代表没做任何操作,则无需返回值,否则则保存当前修改的图片并返回地址
if (mFaceId == 0) {
setResult(RESULT_CANCELED);
finish();
} else {
// 保存修改后的图片
if(mNewBitmap != null){
mOldBitmap = mNewBitmap;
}
mNewBitmap = Bitmap.createBitmap(mOldBitmap.getWidth(),
mOldBitmap.getHeight(), Config.ARGB_8888);
LinkedList<FaceImage> mFaceImages = mDisplay
.getFaceImages();
Canvas canvas = new Canvas(mNewBitmap);
canvas.drawBitmap(mOldBitmap, 0, 0, null);
for (int i = mFaceImages.size(); i > 0; i--) {
mFaceImages.get(i - 1).draw(canvas);
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
// 保存到本地
mPath = PhotoUtil.saveToLocalPNG(mNewBitmap);
// 返回图片地址并关闭当前界面
Intent intent = new Intent();
intent.putExtra("path", mPath);
setResult(RESULT_OK, intent);
finish();
}
}
});
mFace_1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 1;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/new_year_1.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 2;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/new_year_2.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 3;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/new_year_3.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_4.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 4;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/new_year_4.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_5.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 5;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face_forbite.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_6.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 6;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face_rabbit.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_7.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 7;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face1.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_8.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 8;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face2.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_9.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 9;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face3.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_10.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 10;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face4.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_11.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 11;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face9.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_12.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 12;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face10.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_13.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mFaceId = 13;
mFaceBitmap = BitmapFactory.decodeStream(getAssets().open(
"accessories/image_face11.png"));
mDisplay.addFace(mFaceBitmap);
mDisplay.invalidate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFace_14.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mFaceId = 14;
mDisplay.setOnTouchListener(touchListener);
}
});
}
private void init() {
// 获取图片地址
mPath = getIntent().getStringExtra("path");
// 获取缩放的图片
mOldBitmap = zoom(mKXApplication.getPhoneAlbum(mPath));
// 显示图片
mDisplay.setImageBitmap(mOldBitmap);
}
public static void makeMosaicXY(int x, int y) {
rectF = new RectF();
rectF.set((int) x - FaceImageView.min_mosaic_block_size, (int) y
- FaceImageView.min_mosaic_block_size, (int) x
+ FaceImageView.min_mosaic_block_size, (int) y
+ FaceImageView.min_mosaic_block_size);
if(mOldBitmap != null){
if(mNewBitmap != null ){
mNewBitmap = FaceImageView.makeMosaic(mNewBitmap, rectF, 15);
}else{
mNewBitmap = FaceImageView.makeMosaic(mOldBitmap, rectF, 15);
}
mDisplay.setImageBitmap(FaceImageView.makeMosaic(mNewBitmap, rectF, 15));
}
}
static OnTouchListener touchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
int action = ev.getAction();
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
x = (int) ev.getX();
y = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
makeMosaicXY(x, y);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
};
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
makeMosaicXY(x, y);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
/**
* 缩放图片
*
* @param bitmap
* 需要缩放的图片
* @return 缩放后的图片
*/
public Bitmap zoom(Bitmap bitmap) {
// 获取图片的高度和宽度
float width = bitmap.getWidth();
float height = bitmap.getHeight();
// 获取40dip的px值
int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 40, getResources()
.getDisplayMetrics());
// 设置最大宽度和高度
float maxWidth = mMaxWidth - padding;
float maxHeight = mMaxHeight - padding;
// 判断如果宽度或高度超过最大值,则缩放,否则返回原图片
if (width > maxWidth || height > maxHeight) {
// 获取缩放比例
float scale = getScale(width, height, maxWidth, maxHeight);
// 缩放后的图片的宽度和高度
int bitmapWidth = (int) (width * scale);
int bitmapHeight = (int) (height * scale);
// 创建缩放的图片
Bitmap zoomBitmap = Bitmap.createScaledBitmap(bitmap, bitmapWidth,
bitmapHeight, true);
return zoomBitmap;
} else {
return bitmap;
}
}
/**
* 获取缩放比例
*
* @param width
* 当前图片的宽度
* @param height
* 当前图片的高度
* @param maxWidth
* 最大宽度
* @param maxHeight
* 最大高度
* @return
*/
private float getScale(float width, float height, float maxWidth,
float maxHeight) {
float scaleWidth = maxWidth / width;
float scaleHeight = maxHeight / height;
return Math.min(scaleWidth, scaleHeight);
}
/**
* 返回对话框
*/
private void backDialog() {
AlertDialog.Builder builder = new Builder(ImageFilterFaceActivity.this);
builder.setTitle("OOXX");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage("你确定要取消编辑吗?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
setResult(RESULT_CANCELED);
finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
}
public void onBackPressed() {
// 返回对话框
backDialog();
}
}