package com.photoshare.fragments; 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.os.Handler; import android.os.Message; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.photoshare.polygonfill.DrawLineDelegate; import com.photoshare.polygonfill.PolygonFill; import com.photoshare.tabHost.R; import com.photoshare.tabHost.TabHostActivity; import com.photoshare.utils.Config; import com.photoshare.utils.ImageTool; import com.photoshare.view.cropview.ImageZoomView; import com.photoshare.view.cropview.ParcelableObject; import com.photoshare.view.cropview.SimpleZoomListener; import com.photoshare.view.cropview.ZoomState; public class ShowWardrobeActivity extends TabHostActivity { /** Called when the activity is first created. */ // zoomview变量 private ImageZoomView mZoomView; private ZoomState mZoomState; private Bitmap mBitmap, bmp, oBitmap; private SimpleZoomListener mZoomListener; /* private ProgressBar progressBar; */ private Button btnHome, btnOperate, btnMove, btnCrop, btnRotate, btnCancel, btnSave, btnUpload; private String url = ""; private ImageView imageView; // quickAction变量 /* * private final int mID_back = 1; private final int mID_draw = 2; private * final int mID_move = 3; private final int mID_save = 4; private final int * mID_upload = 5; private final int mID_cancel = 6; */ // 剪刀变量 private static final String TAG = "Touch"; Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); PointF start = new PointF(); PointF mid = new PointF(); float oldDist; private float scaleWidth = 1; private float scaleHeight = 1; static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = ZOOM; private boolean startMove; private int startX; private int startY; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // progressBar.setVisibility(View.GONE); mZoomView.setImage(mBitmap); mZoomState = new ZoomState(); mZoomView.setZoomState(mZoomState); mZoomState.setImageZoomView(mZoomView);// 可能需要修改 mZoomListener = new SimpleZoomListener(); mZoomListener.setZoomState(mZoomState); mZoomListener.mBitmap = mBitmap; mZoomView.setOnTouchListener(mZoomListener); 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)); } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_image); mZoomView = (ImageZoomView) findViewById(R.id.zoomView); // progressBar = (ProgressBar) findViewById(R.id.progress_large); btnHome = (Button) findViewById(R.id.btnHome); btnOperate = (Button) findViewById(R.id.btnOperate); btnMove = (Button) findViewById(R.id.btnMove); btnCrop = (Button) findViewById(R.id.btnCrop); btnRotate = (Button) findViewById(R.id.btnRotate); btnCancel = (Button) findViewById(R.id.btnCancel); btnSave = (Button) findViewById(R.id.btnSave); btnUpload = (Button) findViewById(R.id.btnUpload); imageView = (ImageView) findViewById(R.id.imageView); // progressBar.setVisibility(View.VISIBLE); getImage(); handler.sendEmptyMessage(0); initButton(); // initZoomControl(); initImageView(); } public void getImage() { ParcelableObject passObject = this.getIntent() .getParcelableExtra("key"); mBitmap = passObject.getBitmap(); url = passObject.getUrl(); mBitmap = ImageTool.imageZoom(mBitmap, 320, 500); /* * try { saveMyBitmap("haha"); } catch (IOException e) { * e.printStackTrace(); } */ oBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888, true); } public void initImageView() { imageView.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; startMove = true; 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( ShowWardrobeActivity.this.getResources(), R.drawable.arrow); bmp = ImageTool.imageZoom(bmp, 50, 50); imageView.setImageBitmap(bmp); imageView.setVisibility(View.GONE); } /* * public void saveMyBitmap(String bitName) throws IOException { File f = * new File("/sdcard/YiBan/" + bitName + ".png"); if (f.exists()) { * f.delete(); } f.createNewFile(); FileOutputStream fOut = null; try { fOut * = new FileOutputStream(f); } catch (FileNotFoundException e) { * e.printStackTrace(); } mBitmap.compress(Bitmap.CompressFormat.PNG, 100, * fOut); * * try { fOut.flush(); } catch (IOException e) { e.printStackTrace(); } try * { fOut.close(); } catch (IOException e) { e.printStackTrace(); } } */ /* * public void initZoomControl() { ZoomControls zoomCtrl = (ZoomControls) * findViewById(R.id.zoomCtrl); zoomCtrl.setOnZoomInClickListener(new * OnClickListener() { public void onClick(View v) { float z = * mZoomState.getZoom() + 0.25f; mZoomState.setZoom(z); * mZoomState.notifyObservers(); } }); * zoomCtrl.setOnZoomOutClickListener(new OnClickListener() { * * public void onClick(View v) { float z = mZoomState.getZoom() - 0.25f; * mZoomState.setZoom(z); mZoomState.notifyObservers(); } }); * zoomCtrl.setVisibility(View.GONE); } */ public void initButton() { /* * btnHome.setOnClickListener(new OnClickListener() { * * public void onClick(View v) { // TODO Auto-generated method stub * onBackPressed(); } * * }); */ btnOperate.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mZoomView.operateType = 2; Toast.makeText(getApplicationContext(), "指尖轻动,一气呵成", Toast.LENGTH_SHORT).show(); } }); btnMove.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mZoomView.operateType = 1; Toast.makeText(getApplicationContext(), "单点移动图片", Toast.LENGTH_SHORT).show(); } }); btnCrop.setOnClickListener(new OnClickListener() { public void onClick(View v) { // mQuickAction.show(v); // mQuickAction.setAnimStyle(QuickAction.ANIM_GROW_FROM_CENTER); pf = new PolygonFill(mBitmap.getWidth(), mBitmap.getHeight(), new DrawLine()); pf.polygonFill(Config.pointList); mZoomView.invalidate(); mZoomView.operateType = 1; Config.pointList.clear(); } }); btnRotate.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mBitmap = ImageTool.rotateBitmap(mBitmap, 90); handler.sendEmptyMessage(0); mZoomView.invalidate(); } }); /* * btnCancel.setOnClickListener(new OnClickListener() { * * public void onClick(View v) { // TODO Auto-generated method stub * * // mZoomView.setImage(oBitmap); mBitmap = oBitmap; * handler.sendEmptyMessage(0); mZoomView.invalidate(); } * * }); btnSave.setOnClickListener(new OnClickListener() { * * public void onClick(View v) { // TODO Auto-generated method stub * * String path = getResources().getString(R.string.cropedDirStr); * ImageTool.saveImage(mBitmap, path, "", 0); FileTools.deleteFile(url); * Toast.makeText(getApplicationContext(), "保存成功", * Toast.LENGTH_SHORT).show(); } * * }); btnUpload.setOnClickListener(new OnClickListener() { * * public void onClick(View v) { // TODO Auto-generated method stub * * } * * }); */ } // 计算移动距离 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); } /* * @Override public void finish() { super.finish(); if (mZoomView != null) { * mZoomView.Destroy(); } if (mBitmap != null) { mBitmap.recycle(); } if * (oBitmap != null) { oBitmap.recycle(); } * * if (bmp != null) { bmp.recycle(); } } */ /* * @Override protected void onDestroy() { super.onDestroy(); if (mZoomView * != null) { mZoomView.Destroy(); } if (mBitmap != null) { * mBitmap.recycle(); } if (bmp != null) { bmp.recycle(); } * * } */ /* * @Override public void onBackPressed() { super.onBackPressed(); } */ private void resetZoomState() { mZoomState.setPanX(0.5f); mZoomState.setPanY(0.5f); mZoomState.setZoom(1f); mZoomState.notifyObservers(); } }