安卓大图片不失真拉拽放大缩小
来源:互联网 发布:餐饮消费人群数据分析 编辑:程序博客网 时间:2024/04/28 22:41
这些天都在搞图片处理,要求显示大图(2m以上)都知道安卓应用默认加载的图片大小是不能太大的,如果太大的话就会内存溢出。而且不能压缩失真,其实android自带的一些控件是能实现拖拽的但都不符合我的需求,于是在网上找答案,还是有点眉目的就是没有和我一模一样的需求,于是那过来比对修改搞来了半天,终于还是出来效果了。还是相信那么一句话,没有白费的功夫。有付出还是会有回报的。现在为了和我一样需求的人不至于乱费时间,我把源码贴出来共享一下。
package com.hcq.jpg; import java.io.InputStream;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.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewConfiguration;import android.view.ViewGroup.LayoutParams;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;import android.widget.ImageView.ScaleType; @SuppressLint("NewApi")public class Main extends Activity { ImageView iv; float lastX ,lastY; int globalX, globalY; int globalWidth, globalHeight; final Handler handler = new Handler(); Bitmap png = null; float mTouchSlop; private ZoomImageView zoomImageView; private boolean mIsDragging; Runnable mSetBitmap = new Runnable() { @Override public void run() { // setImage(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); final Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); iv = new ImageView(this); iv.setAdjustViewBounds(true); iv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); iv.setScaleType(ScaleType.CENTER); width = iv.getWidth(); height = iv.getHeight();//setContentView(iv); iv.setOnTouchListener(new MulitPointTouchListener()); zoomImageView = (ZoomImageView) findViewById(R.id.zoom_image_view);// 取出图片路径,并解析成Bitmap对象,然后在ZoomImageView中显示//String imagePath = getIntent().getStringExtra("image_path");InputStream is = getResources().openRawResource(R.drawable.ta); png = BitmapFactory.decodeStream(is);//bitmap = BitmapFactory.decodeFile(imagePath);zoomImageView.setImageBitmap(png); new Thread(){ @Override public void run() { super.run(); try { InputStream is = getResources().openRawResource(R.drawable.one); png = BitmapFactory.decodeStream(is); handler.post(mSetBitmap); } catch (Exception e) { e.printStackTrace(); } }}.start(); final ViewConfiguration configuration = ViewConfiguration.get(getApplicationContext());mTouchSlop = configuration.getScaledTouchSlop(); } void setImage() { if(png != null) { iv.setImageBitmap(png); globalWidth = png.getWidth(); globalHeight = png.getHeight(); handler.removeCallbacks(mSetBitmap); iv.setScaleType(ScaleType.MATRIX); iv.setImageMatrix(iv.getImageMatrix()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public class MulitPointTouchListener implements OnTouchListener { Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); PointF pf = new PointF(); float mx, my; public MulitPointTouchListener() { super(); } @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; float dx = event.getX() - lastX,dy = event.getX() - lastY; switch(event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); pf.set(event.getX(), event.getY()); mIsDragging =false; break; case MotionEvent.ACTION_MOVE: matrix.set(savedMatrix);// mx = event.getX() - pf.x;// my = event.getY() - pf.y;// globalX += mx;// globalY += my;// lastX = event.getX();// lastY = event.getY();// matrix.postTranslate(mx, my);// Log.i("MXY", pf.x + "," + pf.y + "," + mx + "," + my + "," + view.getWidth() + "," + view.getHeight()); // 只有单指按在屏幕上移动时,为拖动状态float xMove = event.getX();float yMove = event.getY();if (lastXMove == -1 && lastYMove == -1) {lastXMove = xMove;lastYMove = yMove;}movedDistanceX = xMove - lastXMove;movedDistanceY = yMove - lastYMove;// 进行边界检查,不允许将图片拖出边界if (totalTranslateX + movedDistanceX > 0) {movedDistanceX = 0;} else if (width - (totalTranslateX + movedDistanceX) > globalWidth) {movedDistanceX = 0;}if (totalTranslateY + movedDistanceY > 0) {movedDistanceY = 0;} else if (height - (totalTranslateY + movedDistanceY) > globalHeight) {movedDistanceY = 0;}// 调用onDraw()方法绘制图片lastXMove = xMove;lastYMove = yMove;matrix.postTranslate(movedDistanceX, movedDistanceY);view.setImageMatrix(matrix); break; default: break; } return true; } } /** * 记录当前图片的宽度,图片被缩放时,这个值会一起变动 */private float currentBitmapWidth;/** * 记录当前图片的高度,图片被缩放时,这个值会一起变动 */private float currentBitmapHeight;/** * ZoomImageView控件的宽度 */private int width;/** * ZoomImageView控件的高度 */private int height; /** * 记录上次手指移动时的横坐标 */private float lastXMove = -1;/** * 记录上次手指移动时的纵坐标 */private float lastYMove = -1;/** * 记录手指在横坐标方向上的移动距离 */private float movedDistanceX;/** * 记录手指在纵坐标方向上的移动距离 */private float movedDistanceY;/** * 记录图片在矩阵上的横向偏移值 */private float totalTranslateX;/** * 记录图片在矩阵上的纵向偏移值 */private float totalTranslateY ; @Override protected void onStop() { if (png != null) { if (!png.isRecycled()) { png.recycle(); png = null; System.gc(); } } super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); if (png != null) { if (!png.isRecycled()) { png.recycle(); png = null; System.gc(); } } }}
0 0
- 安卓大图片不失真拉拽放大缩小
- 安卓大图片处理的入门
- 安卓读取本机大图片
- 安卓解决大图片内存溢出
- 安卓 ImageView伸缩放大缩小
- 安卓实现图片旋转放大缩小
- GTK在windwosXP+VS2010实现,图片打开、显示放大缩小功能(图片不失真)
- tableView下移,拉大图片
- 深入安卓大图片处理机制,本地及网络图片不加载到内存预压缩
- Java图片缩小后不失真代码
- IOS 图片点击放大不失真
- Qt实现大图片快速缩小的算法
- UIscrollview放入大图滑动and捏合放大缩小
- android 加载assets下图片,手势放大缩小
- Android加载大图片不OutOfMemoryError
- android 加载大图长图失真或者不显示。
- android 加载大图长图失真或者不显示
- 图片拖拽,放大,缩小
- java定时任务
- EasyUi Tree 数据 对象 递归
- Iphone 和 Ipad 开发 区别
- Pro Android学习笔记(一一六):Location(2):LocationManager的位置获取
- 使用 JQueryMobile 点击超链接提示“error loading page” 错误
- 安卓大图片不失真拉拽放大缩小
- 代码块_iOS_1
- The Dragon of Loowater(poj3646)
- js == 和 === 区别
- 应届大学生 再就业 自由职业者首选三大职业
- STL学习之map容器
- Clojure 语言的设计
- Eclipse的快捷键大全
- Linux下用inotify-tool实时监控服务器文件系统