package coolbuy360.service;
import java.io.File;
import java.io.IOException;
import coolbuy360.searchhealth.R;
/*import net.oschina.app.AppContext;
import net.oschina.app.AppException;
import net.oschina.app.R;
import net.oschina.app.api.ApiClient;
import net.oschina.app.common.FileUtils;
import net.oschina.app.common.ImageUtils;
import net.oschina.app.common.StringUtils;
import net.oschina.app.common.UIHelper;
import net.oschina.app.ui.ImageZoomDialog;*/
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.FloatMath;
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 android.widget.ViewSwitcher;
public class ImageZoomDialog extends Activity implements OnTouchListener,
OnClickListener {
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF start = new PointF();
PointF mid = new PointF();
DisplayMetrics dm;
float oldDist = 1f;
private ImageView imgView;
private Button zoomIn, zoomOut;
private ViewSwitcher mViewSwitcher;
private Button btnSave;
// button zoom
private float scaleWidth = 1;
private float scaleHeight = 1;
private Bitmap bitmap, zoomedBMP;
private int zoom_level = 0;
private static final double ZOOM_IN_SCALE = 1.25;// �Ŵ�ϵ��
private static final double ZOOM_OUT_SCALE = 0.8;// ��Сϵ��
float minScaleR;// ��С���ű���
static final float MAX_SCALE = 4f;// ������ű���
// We can be in one of these 3 states
static final int NONE = 0;// ��ʼ״̬
static final int DRAG = 1;// �϶�
static final int ZOOM = 2;// ����
int mode = NONE;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_zoom_dialog);
this.initView();
this.initData();
}
private void initView() {
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);// ��ȡ�ֱ���
// zoomIn = (Button) findViewById(R.id.zoom_in);// �Ŵ�ť
// zoomOut = (Button) findViewById(R.id.zoom_out);// ��С��ť
// zoomIn.setOnClickListener(this);
// zoomOut.setOnClickListener(this);
imgView = (ImageView) findViewById(R.id.imagezoomdialog_image);
imgView.setOnTouchListener(this);// ��������
mViewSwitcher = (ViewSwitcher) findViewById(R.id.imagezoomdialog_view_switcher);
// ���浽ͼ��
btnSave = (Button) findViewById(R.id.btn_save);
/*btnSave.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
try {
String saveImagePath = ((AppContext) getApplication())
.getSaveImagePath();
ImageUtils.saveImageToSD(ImageZoomDialog.this,
saveImagePath + ImageUtils.getTempFileName()
+ ".jpg", bitmap, 100);
UIHelper.ToastMessage(ImageZoomDialog.this, "����ɹ�");
} catch (IOException e) {
e.printStackTrace();
UIHelper.ToastMessage(ImageZoomDialog.this, "����ʧ��");
}
}
});
*/
}
private void initData() {
final String imgURL = getIntent().getStringExtra("img_url");
final String ErrMsg = getString(R.string.msg_load_image_fail);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1 && msg.obj != null) {
bitmap = (Bitmap) msg.obj;
imgView.setImageBitmap(bitmap);
minZoom();// ������С���ű�
CheckView();// ����ͼ�����
imgView.setImageMatrix(matrix);
mViewSwitcher.showNext();
btnSave.setVisibility(View.VISIBLE);
} else {
// UIHelper.ToastMessage(ImageZoomDialog.this, ErrMsg);
Toast.makeText(ImageZoomDialog.this, ErrMsg, Toast.LENGTH_LONG).show();
finish();
}
}
};
new Thread() {
public void run() {
Message msg = new Message();
Bitmap bmp = null;
String filename = fileUtril.getFileName(imgURL);
try {
// ��ȡ����ͼƬ
if (imgURL.endsWith("portrait.gif")
|| imgURL.equals("")) {
bmp = BitmapFactory
.decodeResource(imgView.getResources(),
R.drawable.down_img);
}
if (bmp == null) {
// �Ƿ��л���ͼƬ
// Environment.getExternalStorageDirectory();����/sdcard
/*String filepath = getFilesDir() + File.separator
+ filename;
File file = new File(filepath);
if (file.exists()) {
bmp = picUtril.getBitmap(imgView.getContext(),
filename);
}*/
File file= fileUtril.getSDandCacheFile(ImageZoomDialog.this,imgURL);
//
if(file!=null)
{
bmp= picUtril.getBitmapFromFile(ImageZoomDialog.this,file) ;
}
else {
bmp=null;
}
//bmp= picUtril.getBitmapFromFile(ImageZoomDialog.this, fileUtril.getCacheFile(imgURL));
}
if (bmp == null) {
bmp = picUtril.getbitmapAndwrite(ImageZoomDialog.this,imgURL); //ApiClient.getNetBitmap(imgURL);
if (bmp != null) {
/*try {
// дͼƬ����
ImageUtils.saveImage(imgView.getContext(),
filename, bmp);
} catch (IOException e) {
e.printStackTrace();
}*/
// ����ͼƬ
bmp = picUtril.reDrawBitMap(ImageZoomDialog.this,
bmp);
}
}
msg.what = 1;
msg.obj = bmp;
} catch (Exception e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
handler.sendMessage(msg);
}
}.start();
}
public boolean onTouch(View v, MotionEvent event) {
// Handle touch events here...
ImageView imgView = (ImageView) v;
// 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, "mode=DRAG");
mode = DRAG;
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;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
// Log.d(TAG, "mode=NONE");
break;
// ��ΪDRAGģʽ�������ƶ�ͼƬ
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
// �����
matrix.postTranslate(event.getX() - start.x, event.getY()
- start.y);
}
// ��Ϊ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
imgView.setImageMatrix(matrix);
CheckView();
return true; // indicate event was handled
}
/**
* ���������С���ű������Զ�����
*/
private void CheckView() {
float p[] = new float[9];
matrix.getValues(p);
if (mode == ZOOM) {
if (p[0] < minScaleR) {
matrix.setScale(minScaleR, minScaleR);
}
if (p[0] > MAX_SCALE) {
matrix.set(savedMatrix);
}
}
center();
}
/**
* ��С���ű��������Ϊ100%
*/
private void minZoom() {
// minScaleR = Math.min(
// (float) dm.widthPixels / (float) bitmap.getWidth(),
// (float) dm.heightPixels / (float) bitmap.getHeight());
if (bitmap.getWidth() >= dm.widthPixels)
minScaleR = ((float) dm.widthPixels) / bitmap.getWidth();
else
minScaleR = 1.0f;
if (minScaleR < 1.0) {
matrix.postScale(minScaleR, minScaleR);
}
}
private void center() {
center(true, true);
}
/**
* �����������
*/
protected void center(boolean horizontal, boolean vertical) {
Matrix m = new Matrix();
m.set(matrix);
RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
m.mapRect(rect);
float height = rect.height();
float width = rect.width();
float deltaX = 0, deltaY = 0;
if (vertical) {
// ͼƬС����Ļ��С���������ʾ��������Ļ���Ϸ������������ƣ��·�������������
int screenHeight = dm.heightPixels;
if (height < screenHeight) {
deltaY = (screenHeight - height) / 2 - rect.top;
} else if (rect.top > 0) {
deltaY = -rect.top;
} else if (rect.bottom < screenHeight) {
deltaY = imgView.getHeight() - rect.bottom;
}
}
if (horizontal) {
int screenWidth = dm.widthPixels;
if (width < screenWidth) {
deltaX = (screenWidth - width) / 2 - rect.left;
} else if (rect.left > 0) {
deltaX = -rect.left;
} else if (rect.right < screenWidth) {
deltaX = screenWidth - rect.right;
}
}
matrix.postTranslate(deltaX, deltaY);
}
// �����ƶ�����
@SuppressLint("NewApi")
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);
}
// �����е�λ��
@SuppressLint("NewApi")
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 onClick(View v) {
if (v == zoomIn) {
enlarge();
} else if (v == zoomOut) {
small();
}
}
// ��ť�����С����
private void small() {
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
scaleWidth = (float) (scaleWidth * ZOOM_OUT_SCALE);
scaleHeight = (float) (scaleHeight * ZOOM_OUT_SCALE);
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
zoomedBMP = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight,
matrix, true);
imgView.setImageBitmap(zoomedBMP);
}
// ��ť����Ŵ���
private void enlarge() {
try {
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
scaleWidth = (float) (scaleWidth * ZOOM_IN_SCALE);
scaleHeight = (float) (scaleHeight * ZOOM_IN_SCALE);
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
zoomedBMP = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight,
matrix, true);
imgView.setImageBitmap(zoomedBMP);
} catch (Exception e) {
// can't zoom because of memory issue, just ignore, no big deal
}
}
}