/**
*
*/
package com.photoshare.camera;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import com.photoshare.fragments.BaseFragment;
import com.photoshare.polygonfill.DrawLineDelegate;
import com.photoshare.polygonfill.PolygonFill;
import com.photoshare.service.photos.PhotoBean;
import com.photoshare.tabHost.R;
import com.photoshare.utils.Config;
import com.photoshare.utils.ImageTool;
import com.photoshare.utils.Utils;
import com.photoshare.view.cropview.ImageZoomView;
import com.photoshare.view.cropview.SimpleZoomListener;
import com.photoshare.view.cropview.ZoomState;
/**
* @author Aron
*
*/
public class DecoratedPhotoFragment extends BaseFragment {
private ImageZoomView mZoomView;
private ImageView mImageView;
private ZoomState mZoomState;
private Bitmap mBitmap, bmp, oBitmap;
private SimpleZoomListener mZoomListener;
private final String KEY_PHOTO_CROP = "CROP_PHOTO";
private final String KEY_CROP = "isCroping";
private static final String TAG = "Touch";
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF start = new PointF();
PointF mid = new PointF();
float oldDist;
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = ZOOM;
private boolean isCroping = false;
private int startX;
private int startY;
private String leftBtnText = "";
private String rightBtnText = "";
private String titlebarText = "";
public static DecoratedPhotoFragment newInstance(int fragmentViewId) {
DecoratedPhotoFragment dpf = new DecoratedPhotoFragment();
dpf.setFragmentViewId(fragmentViewId);
return dpf;
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (outState != null) {
outState.putParcelable(PhotoBean.KEY_PHOTO, oBitmap);
outState.putParcelable(KEY_PHOTO_CROP, mBitmap);
outState.putBoolean(KEY_CROP, isCroping);
}
super.onSaveInstanceState(outState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.crop_photo_layout, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Bundle params = getArguments();
if (params != null) {
Bitmap bmp = params.getParcelable(PhotoBean.KEY_PHOTO);
if (bmp != null) {
mBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
oBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
}
isCroping = params.getBoolean(KEY_CROP);
// if (isCroping) {
// startCroping();
// } else {
// resetCroping();
// }
}
super.onActivityCreated(savedInstanceState);
init();
}
private void init() {
leftBtnText = getCancleText();
titlebarText = getCropingText();
rightBtnText = getStartText();
initTitleBar(leftBtnText, rightBtnText, titlebarText);
mZoomView = (ImageZoomView) getActivity().findViewById(
R.id.cropZoomView);
mZoomView.setImage(mBitmap);
mZoomState = new ZoomState();
mZoomView.setZoomState(mZoomState);
mZoomState.setImageZoomView(mZoomView);
mZoomListener = new SimpleZoomListener();
mZoomListener.setZoomState(mZoomState);
mZoomListener.mBitmap = mBitmap;
mZoomView.setOnTouchListener(mZoomListener);
mImageView = (ImageView) getActivity().findViewById(R.id.cropImageView);
resetZoomState();
}
private PolygonFill pf = null;
class DrawLine implements DrawLineDelegate {
public void line(int startX, int startY, int endX, int endY) {
// TODO Auto-generated method stub
for (int i = startX; i < endX; i++) {
mBitmap.setPixel(i, mBitmap.getHeight() - startY - 1,
Color.argb(0, 0, 0, 0));
}
}
}
private String getSubmitText() {
return getString(R.string.submit);
}
private String getCancleText() {
return getString(R.string.cancel);
}
private String getCropingText() {
return getString(R.string.croping);
}
private String getDecoratedPhotoShareFragment() {
return getString(R.string.fdecoratedPhotoShareFragment);
}
private String getToastStartCroping() {
return getString(R.string.toastStartCroping);
}
private String getToastStopCroping() {
return getString(R.string.toastStopCroping);
}
private String getDecoratedPhotoFragment() {
return getString(R.string.fdecoratedPhotoFragment);
}
private String getCameraPhotoFragment() {
return getString(R.string.fcameraPhotoFragment);
}
private String getStartText() {
return getString(R.string.start);
}
public void initImageView() {
mImageView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ImageView view = (ImageView) v;
int x = (int) event.getRawX();
int y = (int) event.getRawY();
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 设置拖拉模式
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "action_down:mode=DRAG;" + event.getX() + ";"
+ event.getY());
mode = DRAG;
startX = (int) event.getX();
startY = y - v.getTop();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
// 设置多点触摸模式
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
// 若为DRAG模式,则点击移动图片
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "action_move:" + x + ";" + y);
if (mode == DRAG) {
v.layout(x - startX, y - startY, x + v.getWidth()
- startX, y - startY + v.getHeight());
v.bringToFront();
v.postInvalidate();
}
// 若为ZOOM模式,则多点触摸缩放
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
// 设置缩放比例和图片中点位置
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
// Perform the transformation
view.setImageMatrix(matrix);
return true;
}
});
// 取得drawable中图片,放大,缩小,多点触摸的作用对象
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);
bmp = ImageTool.imageZoom(bmp, 50, 50);
mImageView.setImageBitmap(bmp);
mImageView.setVisibility(View.GONE);
}
// 计算移动距离
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 void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
private void resetZoomState() {
mZoomState.setPanX(0.5f);
mZoomState.setPanY(0.5f);
mZoomState.setZoom(1f);
mZoomState.notifyObservers();
}
private void resetCroping() {
Toast.makeText(getActivity(), getToastStopCroping(), Toast.LENGTH_SHORT)
.show();
resetZoomState();
if (mBitmap != null) {
// mBitmap.recycle();
}
if (bmp != null) {
// bmp.recycle();
}
mZoomView.operateType = 1;
mBitmap = oBitmap;
mZoomView.setImage(mBitmap);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mZoomView != null) {
mZoomView.Destroy();
}
if (mBitmap != null) {
// mBitmap.recycle();
}
if (bmp != null) {
// bmp.recycle();
}
}
/*
* (non-Javadoc)
*
* @see com.photoshare.fragments.BaseFragment#OnRightBtnClicked()
*/
@Override
protected void onRightBtnClicked() {
if (!isCroping) {
startCroping();
isCroping = true;
return;
}
pf = new PolygonFill(mBitmap.getWidth(), mBitmap.getHeight(),
new DrawLine());
pf.polygonFill(Config.pointList);
mZoomView.invalidate();
mZoomView.operateType = 1;
Config.pointList.clear();
Utils.showOptionWindow(getActivity(), "", "",
new Utils.OnOptionListener() {
public void onOK() {
Bundle param = new Bundle();
param.putParcelable(PhotoBean.KEY_PHOTO, mBitmap);
forward(getDecoratedPhotoShareFragment(), param);
}
public void onCancel() {
}
});
}
/**
*
*/
private void startCroping() {
Toast.makeText(this.getActivity(), getToastStartCroping(),
Toast.LENGTH_SHORT).show();
leftBtnText = getCancleText();
rightBtnText = getCropingText();
setTitleBarText(leftBtnText, rightBtnText, titlebarText);
mZoomView.operateType = 2;
}
/*
* (non-Javadoc)
*
* @see com.photoshare.fragments.BaseFragment#OnLeftBtnClicked()
*/
@Override
protected void onLeftBtnClicked() {
if (isCroping) {
leftBtnText = getCancleText();
rightBtnText = getStartText();
setTitleBarText(leftBtnText, rightBtnText, titlebarText);
resetCroping();
isCroping = false;
return;
}
backward(null);
}
@Override
protected void onLoginSuccess() {
// TODO Auto-generated method stub
}
}