package com.example.mysql_tester.library;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
public class ImageViewHelper {
Boolean isZoomed = false;
ImageView imageView;
Bitmap bitmap;
Context context;
private float originalX, originalY;
private float minScaleR; //�̤p�Y����
private Matrix matrix = new Matrix();
private Matrix saved_matrix = new Matrix();
private static final int NONE = 0; //��l��
private static final int DRAG = 1; //�즲
private static final int ZOOM = 2; //�Y��
private DisplayMetrics dm;
private int mode = NONE;
private PointF prev = new PointF();
private PointF mid = new PointF();
private float dist = 1f;
GestureDetector gestureDetector;
public ImageViewHelper(Context context,DisplayMetrics dm,ImageView imageView,Bitmap bitmap) {
this.dm = dm;
this.imageView = imageView;
this.bitmap = bitmap;
this.context = context;
setImageSize();
//minZoom();
center();
imageView.setImageMatrix(matrix);
originalX = bitmap.getWidth();
originalY = bitmap.getHeight();
}
//��������
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
if (isZoomed) {
Matrix originalMartrix = new Matrix();
originalMartrix.postScale(originalX, originalY);
imageView.setImageMatrix(originalMartrix);
imageView.setScaleType(ScaleType.FIT_CENTER);
isZoomed = false;
//Log.e("Touch event Log", "Action Double Tap");
}
return true;
}
}
public Matrix getMatrix() {
return matrix;
}
public void center() {
center(true,true);
}
//���X�ù��d��^�����I
public 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 delta_x = 0, delta_y = 0;
//�Ϥ��p��ù��j�p�A�h�m��
//�j��ù��A�W��d�ťիh���W���A�U��d�ťիh���U��
if (vertical) {
int screen_height = dm.heightPixels;
if (height < screen_height) {
delta_y = (screen_height - height) / 2 - rect.top;
}
else if (rect.top > 0) {
delta_y = -rect.top;
}
else if (rect.bottom < screen_height) {
delta_y = imageView.getHeight() - rect.bottom;
}
}
if (horizontal) {
int screen_width = dm.widthPixels;
if (width < screen_width) {
delta_x = (screen_width - width) / 2 - rect.left;
}
else if (rect.left > 0) {
delta_x = -rect.left;
}
else if (rect.right < screen_width) {
delta_x = screen_width - rect.right;
}
}
matrix.postTranslate(delta_x, delta_y);
}
//��ťIJ���ƥ�,���: ���, ����: �Y��
public void setImageSize() {
gestureDetector = new GestureDetector(context, new GestureListener());
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event); //�ҥ�����
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
saved_matrix.set(matrix);
prev.set(event.getX(), event.getY());
mode = DRAG;
//Log.e("Touch event Log", "Action Down");
break;
case MotionEvent.ACTION_POINTER_DOWN:
dist = spacing(event);
//�p�G���I���Z���W�L10, �N�P�_���h�IIJ�� -- �Y��Ҧ�
if (spacing(event) > 10f) {
saved_matrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
//Log.e("Touch event Log", "Action Pointer Down");
}
break;
case MotionEvent.ACTION_UP:
//Log.e("Touch event Log", "Action Up");
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_UP:
//Log.e("Touch event Log", "Action Pointer Up");
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG && isZoomed) {
matrix.set(saved_matrix);
matrix.postTranslate(event.getX() - prev.x, event.getY() - prev.y);
}
else if (mode == ZOOM) {
float newDist = spacing(event); //������������ʪ��Z��
if (newDist > 10f) {
matrix.set(saved_matrix);
float tScale = newDist / dist;
matrix.postScale(tScale, tScale, mid.x, mid.y);
imageView.setLayoutParams(vp);
isZoomed = true;
}
}
//Log.e("Touch event Log", "Action Move");
break;
}
if (isZoomed) imageView.setScaleType(ScaleType.MATRIX);
imageView.setImageMatrix(matrix);
center();
return true;
}
});
}
//���I���Z��
public float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
float result = (float)Math.sqrt(x * x + y * y);
return result;
}
//���I�����I
public 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);
}
//���o�̤p����ҡA���]�Ϥ���ù��j: �h�ù�(�e/��) / �Ϥ�(�e/��)�|�p��1 -- �N�Ϥ��i���Y�p
//�Ϥ��i���j�A�Ϥ��V�p�A��j���ƶV�j�A�p�G�ù���Ϥ��j�p�ۦP���Ƭ�1,����
public void minZoom() {
minScaleR = Math.min(
(float)dm.widthPixels / (float)bitmap.getWidth(),
(float)dm.heightPixels / (float)bitmap.getHeight());
if (minScaleR <= 1.0) {
matrix.postScale(minScaleR, minScaleR);
}
else {
matrix.postScale(1.5f, 1.5f);
}
}
}