android 大图片拖拽并缩放实现原理

public class SpacePageActivity extends Activity {

	private LinearLayout linnerLayout_spacepage;
	private RelativeLayout relativeLayout_spacepage;
	private Button btn_spacepage_back;
	private Button btn_spacepage_save;
	private static Boolean isTrue = false;

	private static String IMAGE_MIME_TYPE;

	private ImageView image_spacePage;
	private ProgressDialog dialog;
	private Bitmap bitmap;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);// 隐藏标题
		setContentView(R.layout.spacepage);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		initHead();

		if (isNetworkAvailable()) {
			image_spacePage = (ImageView) findViewById(R.id.image_spacepage);
			btn_spacepage_save = (Button) findViewById(R.id.btn_spacepage_save);
			image_spacePage.setOnTouchListener(new MulitPointTouchListener(
					image_spacePage));
			image_spacePage.setScaleType(ScaleType.CENTER_INSIDE);

			// 加载成功
			String urls = "http://epaper.yzdsb.com.cn/201201/04/yz2104_7.jpg";
			bitmap = returnBitMap(urls);
			if (null != bitmap) {
				image_spacePage.setImageBitmap(bitmap);
			}

		}
	}

	public Bitmap returnBitMap(String url) {

		if (null == url || "".equals(url)) {
			return null;
		}
		URL myFileUrl = null;
		Bitmap bitmap = null;
		try {
			myFileUrl = new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		try {
			HttpURLConnection conn = (HttpURLConnection) myFileUrl
					.openConnection();
			conn.setConnectTimeout(2000);
			conn.setDoInput(true);
			conn.connect();
			InputStream is = conn.getInputStream();
			bitmap = BitmapFactory.decodeStream(is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return bitmap;
	}

	public class MulitPointTouchListener implements OnTouchListener {

		Matrix matrix = new Matrix();
		Matrix savedMatrix = new Matrix();

		public ImageView image;
		static final int NONE = 0;
		static final int DRAG = 1;
		static final int ZOOM = 2;
		int mode = NONE;

		PointF start = new PointF();
		PointF mid = new PointF();
		float oldDist = 1f;

		public MulitPointTouchListener(ImageView image) {
			super();
			this.image = image;
		}

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			this.image.setScaleType(ScaleType.MATRIX);

			ImageView view = (ImageView) v;
			// dumpEvent(event);

			switch (event.getAction() & MotionEvent.ACTION_MASK) {

			case MotionEvent.ACTION_DOWN:

				Log.w("FLAG", "ACTION_DOWN");
				matrix.set(view.getImageMatrix());
				savedMatrix.set(matrix);
				start.set(event.getX(), event.getY());
				mode = DRAG;
				break;
			case MotionEvent.ACTION_POINTER_DOWN:
				Log.w("FLAG", "ACTION_POINTER_DOWN");
				oldDist = spacing(event);
				if (oldDist > 10f) {
					savedMatrix.set(matrix);
					midPoint(mid, event);
					mode = ZOOM;
				}
				break;
			case MotionEvent.ACTION_UP:
				Log.w("FLAG", "ACTION_UP");
			case MotionEvent.ACTION_POINTER_UP:
				Log.w("FLAG", "ACTION_POINTER_UP");
				mode = NONE;
				break;
			case MotionEvent.ACTION_MOVE:
				Log.w("FLAG", "ACTION_MOVE");
				if (mode == DRAG) {
					matrix.set(savedMatrix);
					matrix.postTranslate(event.getX() - start.x, event.getY()
							- start.y);
				} else if (mode == ZOOM) {
					float newDist = spacing(event);
					if (newDist > 10f) {
						matrix.set(savedMatrix);
						float scale = newDist / oldDist;
						matrix.postScale(scale, scale, mid.x, mid.y);
					}
				}
				break;
			}

			view.setImageMatrix(matrix);
			return true;
		}

		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 initHead() {
		linnerLayout_spacepage = (LinearLayout) findViewById(R.id.linnerLayout_spacepage);
		relativeLayout_spacepage = (RelativeLayout) findViewById(R.id.relativeLayout_spacepage);
		btn_spacepage_back = (Button) findViewById(R.id.btn_spacepage_back);
		btn_spacepage_back.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				finish();
			}
		});
		btn_spacepage_save = (Button) findViewById(R.id.btn_spacepage_save);

	}

	protected boolean isNetworkAvailable() {
		ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		if (connectivity == null) {
			Log.i("NetWorkState", "Unavailabel");
			return false;
		} else {
			NetworkInfo[] info = connectivity.getAllNetworkInfo();
			if (info != null) {
				for (int i = 0; i < info.length; i++) {
					if (info[i].getState() == NetworkInfo.State.CONNECTED) {
						Log.i("NetWorkState", "Availabel");
						return true;
					}
				}
			}
		}
		return false;
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		if (bitmap != null) {
			if (!bitmap.isRecycled()) {
				bitmap.recycle(); // 回收图片所占的内存
				bitmap = null;
				System.gc(); // 提醒系统及时回收
			}
		}
		super.onStop();
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if (bitmap != null) {
			if (!bitmap.isRecycled()) {
				bitmap.recycle(); // 回收图片所占的内存
				bitmap = null;
				System.gc(); // 提醒系统及时回收
			}
		}
	}
}
因为是大图片,在onDestroy的时候要recycle掉,这样系统才会定时回收掉,System.gc();是提醒系统回收,虽然java这种垃圾回收机制不用我们自己关心对象的回收,但是这也给android开发人员带来了不好的一面,如果系统回收不及时很可能就造成了内存溢出了。什么时候手机不担心内存使用了就好了。 





详细出处参考:http://www.jb51.net/article/32972.htm
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值