|
package com.electric.chargingpile.activity;
import android.app.Activity;
import android.content.Context;
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.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.ImageView;
import com.electric.chargingpile.R;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class ShowImageActivity extends Activity implements OnTouchListener {
private ImageView imgv;
private PointF point0 = new PointF();
private PointF pointM = new PointF();
private final float ZOOM_MIN_SPACE = 10f;
// 设定事件模式
private final int NONE = 0;
private final int DRAG = 1;
private final int ZOOM = 2;
private int mode = NONE;
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
// 获取屏幕分辨率。以480*320为例
private int displayHeight;
private int displayWidth;
private float minScale = 1f;
private float maxScale = 10f;
private float currentScale = 1f;
private float oldDist;
private Bitmap bm;
private String pic_url;
private int imgWidth;
private int imgHeight;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_show_image);
WindowManager wm = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
displayWidth = wm.getDefaultDisplay().getWidth();
displayHeight = wm.getDefaultDisplay().getHeight();
initData();
init();
}
Handler hand = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 2:
hahs();
break;
default:
break;
}
}
;
};
private void init() {
imgv = (ImageView) findViewById(R.id.imgv);
imgv.setOnTouchListener(this);
// bm = BitmapFactory.decodeResource(getResources(),
// R.drawable.bg_banner2_0);
// Bitmap bitmap = ImageLoader.getInstance().loadImageSync(pic_url);
// Bitmap bm=xxx; //xxx根据你的情况获取
//
// Drawable drawable = (Drawable)bitmapDrawable;
//
// Bitmap bitmap = new Bitmap ();
// Drawable drawable = new BitmapDrawable(bitmap);
new Thread(new Runnable() {
@Override
public void run() {
bm = ImageLoader.getInstance().loadImageSync(pic_url);
if (bm != null) {
Message mes = new Message();
mes.obj = bm;
mes.what = 2;
hand.sendMessage(mes);
}
}
}).start();
}
private void hahs() {
// WindowManager wm = (WindowManager)getApplication().getSystemService(Context.WINDOW_SERVICE);
// displayWidth = wm.getDefaultDisplay().getWidth();
imgWidth = bm.getWidth();
imgHeight = bm.getHeight();
imgv.setImageBitmap(bm);
minScale = getMinScale();
matrix.setScale(minScale, minScale);
center();
imgv.setImageMatrix(matrix);
}
private void initData() {
pic_url = getIntent().getStringExtra("pic_url");
Log.e("pic_url", pic_url);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView imgv = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
point0.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > ZOOM_MIN_SPACE) {
savedMatrix.set(matrix);
setMidPoint(event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
whenMove(event);
break;
// case MotionEvent.ACTION_CANCEL:
// finish();
// break;
// case Moti
}
imgv.setImageMatrix(matrix);
checkView();
return true;
}
private void whenMove(MotionEvent event) {
switch (mode) {
case DRAG:
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - point0.x, event.getY()
- point0.y);
break;
case ZOOM:
float newDist = spacing(event);
if (newDist > ZOOM_MIN_SPACE) {
matrix.set(savedMatrix);
float sxy = newDist / oldDist;
System.out.println(sxy + "<==放大缩小倍数");
matrix.postScale(sxy, sxy, pointM.x, pointM.y);
}
break;
}
}
// 两个触点的距离
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (float) Math.sqrt(x * x + y * y);
}
private void setMidPoint(MotionEvent event) {
float x = event.getX(0) + event.getY(1);
float y = event.getY(0) + event.getY(1);
pointM.set(x / 2, y / 2);
}
// 图片居中
private void center() {
RectF rect = new RectF(0, 0, imgWidth, imgHeight);
matrix.mapRect(rect);
float width = rect.width();
float height = rect.height();
float dx = 0;
float dy = 0;
if (width < displayWidth)
dx = displayWidth / 2 - width / 2 - rect.left;
else if (rect.left > 0)
dx = -rect.left;
else if (rect.right < displayWidth)
dx = displayWidth - rect.right;
if (height < displayHeight)
dy = displayHeight / 2 - height / 2 - rect.top;
else if (rect.top > 0)
dy = -rect.top;
else if (rect.bottom < displayHeight)
dy = displayHeight - rect.bottom;
matrix.postTranslate(dx, dy);
}
// 获取最小缩放比例
private float getMinScale() {
float sx = (float) displayWidth / imgWidth;
float sy = (float) displayHeight / imgHeight;
float scale = sx < sy ? sx : sy;
if (scale > 1) {
scale = 1f;
}
return scale;
}
// 检查约束条件,是否居中,空间显示是否合理
private void checkView() {
currentScale = getCurrentScale();
if (mode == ZOOM) {
if (currentScale < minScale) {
matrix.setScale(minScale, minScale);
}
if (currentScale > maxScale) {
matrix.set(savedMatrix);
}
}
center();
}
// 图片当前的缩放比例
private float getCurrentScale() {
float[] values = new float[9];
matrix.getValues(values);
return values[Matrix.MSCALE_X];
}
public Bitmap getBitMapFromUrl(String url) {
Bitmap bitmap = null;
URL u = null;
HttpURLConnection conn = null;
InputStream is = null;
try {
u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
}
return bitmap;
}
// public static Bitmap GetLocalOrNetBitmap(String url)
// {
// Bitmap bitmap = null;
// InputStream in = null;
// BufferedOutputStream out = null;
// try
// {
// in = new BufferedInputStream(new URL(url).openStream(), Constant.IO_BUFFER_SIZE);
// final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
// out = new BufferedOutputStream(dataStream, Constants.IO_BUFFER_SIZE);
// copy(in, out);
// out.flush();
// byte[] data = dataStream.toByteArray();
// bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
// data = null;
// return bitmap;
// }
// catch (IOException e)
// {
// e.printStackTrace();
// return null;
// }
// }
//
// private static void copy(InputStream in, OutputStream out)
// throws IOException {
// byte[] b = new byte[IO_BUFFER_SIZE];
// int read;
// while ((read = in.read(b)) != -1) {
// out.write(b, 0, read);
// }
// }
/**
* return a bitmap from service
*
* @param url
* @return bitmap type
*/
public final static Bitmap returnBitMap(String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {
myFileUrl = new URL(url);
HttpURLConnection conn;
conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
}
|