android开发获取网络图片并可拖拽移动
来源:互联网 发布:有感情朗读软件 编辑:程序博客网 时间:2024/06/05 23:52
这一篇讲获取网络图片,然后显示出来,并对其操作,如拖拽,放大,缩小,移动。
首先,先访问网络图片,代码如下:
先定义一个线程,因为在android4.0以上的系统中,不支持有阻塞的操作在主线程里发生,所以得新定义一个线程,这个线程包括访问网络操作。
Thread xiaoli_thread=new Thread(new Runnable(){@Override//该线程通过网络,获取校历的数据流public void run() { try{ URL url= new URL(PATH); HttpURLConnection conn= (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(6 * 1000); // 别超过6秒 conn.setDoInput(true); conn.connect(); InputStream inputStream=conn.getInputStream(); if(inputStream==null){ Log.i(TAG,"picture got failed"); }else{ bmp= BitmapFactory.decodeStream(inputStream); Log.i(TAG,"picture got"); MAX_W=bmp.getWidth()*2; MAX_H=bmp.getHeight()*2; MIN_W=bmp.getWidth()/2; MIN_H=bmp.getHeight()/2; Message msg=new Message(); msg.what=SHOW_PICTURE; handler.sendMessage(msg); } }catch (SocketTimeoutException e){ Log.i(TAG,"SocketTimeoutException"); e.printStackTrace(); } catch (MalformedURLException e){ Log.i(TAG,"MalformedURLException"); e.printStackTrace(); }catch (IOException e) { Log.i(TAG,"IOException"); e.printStackTrace(); } } });再定义一个handler获取线程发送的消息
final Handler handler=new Handler(){ @Override//接收线程发出的信息,缓冲框消失public void handleMessage(Message msg){switch(msg.what){case SHOW_PICTURE: img.setImageBitmap(bmp); dialog.dismiss();break;}}};
然后,在oncreate()方法中
//后台启动校历线程,加载学校校历图片xiaoli_thread.start();Log.i(TAG,"new xiaoli_thread start!");这样网络上的图片就可以显示出来了,当然还要有配置文件,这里就不说了。
接下来,就是对图片的操作。
先定义触摸、放大、缩小事件
img.setOnTouchListener(new MulitPointTouchListener(img));
zoomcon=(ZoomControls)super.findViewById(R.id.zoomcontrol);this.zoomcon.setOnZoomInClickListener(new onzoominclicklistener());//放大监听this.zoomcon.setOnZoomOutClickListener(new onzoomoutclicklistener());//缩小监听zoomcon.setIsZoomInEnabled(true); zoomcon.setIsZoomOutEnabled(true);
然后,再写具体的方法
1、触摸即多点触控方法
/** * @继承OnTouchListener实现多点触控 */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; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: Log.w("FLAG", "ACTION_DOWN"); //设置底部组件的可见性 if(IsVisible){ bottom.setVisibility(View.INVISIBLE); IsVisible = false; Log.i(TAG,"onClick1"); }else{ bottom.setVisibility(View.VISIBLE); IsVisible = true; Log.i(TAG,"onClick2"); } 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); } }
2、放大操作
/** * @放大图片 */private class onzoominclicklistener implements OnClickListener{@Overridepublic void onClick(View v) {int bmpWidth = bmp.getWidth(); int bmpHeight = bmp.getHeight(); //设置图片放大但比例 double scale = 1.25; //计算这次要放大的比例 scaleWidth = (float)(scaleWidth*scale); scaleHeight = (float)(scaleHeight*scale); //产生新的大小但Bitmap对象 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); try{ Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true); if(resizeBmp.getWidth()>=(MAX_W-350 )|| resizeBmp.getHeight()>=(MAX_H-350)){ zoomcon.setIsZoomInEnabled(false); }else{ img.setImageBitmap(resizeBmp); zoomcon.setIsZoomOutEnabled(true); } }catch(IllegalArgumentException e){ Log.e(TAG,"IllegalArgumentException"); e.printStackTrace(); }catch(Exception e){ Log.e(TAG,"Exception"); e.printStackTrace(); }}}
3、缩小操作
/** * @缩小图片 */private class onzoomoutclicklistener implements OnClickListener{@Overridepublic void onClick(View v) {int bmpWidth=bmp.getWidth(); int bmpHeight=bmp.getHeight(); /* 设置图片缩小的比例 */ double scale=0.8; /* 计算出这次要缩小的比例 */ scaleWidth=(float) (scaleWidth*scale); scaleHeight=(float) (scaleHeight*scale); /* 产生reSize后的Bitmap对象 */ Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); try{ Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth, bmpHeight,matrix,true); if(resizeBmp.getWidth()<=MIN_W || resizeBmp.getHeight()<=MIN_H){ zoomcon.setIsZoomOutEnabled(false); }else{ img.setImageBitmap(resizeBmp); zoomcon.setIsZoomInEnabled(true); } }catch(IllegalArgumentException e){ Log.e(TAG,"IllegalArgumentException"); e.printStackTrace(); }catch(Exception e){ Log.e(TAG,"Exception"); e.printStackTrace(); } }}
啊,代码有点长,最好在最后还要加上回收图片,因为它占的内存比较多
@Override protected void onStop() { if(bmp!=null){ if(!bmp.isRecycled()){ bmp.recycle(); //回收图片所占的内存 bmp=null; System.gc(); //提醒系统及时回收 } } super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); if(bmp!=null){ if(!bmp.isRecycled()){ bmp.recycle(); //回收图片所占的内存 bmp=null; System.gc(); //提醒系统及时回收 } } }
效果图如下:
安卓市场:http://apk.hiapk.com/html/2013/05/1468059.html?module=256&info=IWjtVg9cqVJLYg%3D%3D
N多市场:http://www.nduoa.com/apk/detail/553415
360手机助手:http://zhushou.360.cn/search/index/?kw=%E6%A0%A1%E5%9B%AD%E5%B0%8F%E5%8A%A9%E6%89%8B
百度应用:http://as.baidu.com/a/item?docid=3101724&pre=web_am_se
优亿市场(eoe):http://www.eoemarket.com/search/apps/?keyword=%E6%A0%A1%E5%9B%AD%E5%B0%8F%E5%8A%A9%E6%89%8B
- android开发获取网络图片并可拖拽移动
- Android从网络获取图片并放大
- android 网络获取图片并存储
- android从网络获取图片并显示
- [Android] 获取网络图片并显示
- 【移动开发】Android相机、相册获取图片显示并保存到SD卡
- 【Android开发】范例1-开启新线程获取网络图片并显示到ImageView中
- android开发——获取网络图片
- android开发--获取网络图片,读取进度条
- Android开发之网络图片获取
- android开发--获取网络图片,读取进度条
- IOS开发-从网络获取图片并显示
- 获取网络图片并显示
- 网络获取图片并缓存
- android从网络获取图片并显示和保存
- android 获取网络图片并在Imageview上显示
- Android从网络获取图片,并缓存到SD卡
- Android基础-获取网络上的图片并显示
- sprintf函数的一点笔记
- 今天发现Eclipse cdt 使用scanf后…
- 《C语言深度解剖》小记
- C standard library contents
- 一个动态分配二维数组的ANSI C程序
- android开发获取网络图片并可拖拽移动
- C语言实现数学上的组合和排列
- 排列组合问题的通用算法
- 在c++中 struct 和class
- CTParagraphStyleSpecifier
- [转]已知两圆圆心坐标及半径求两圆…
- C实现简易运动轨迹检测的程序
- C实现一个检查点在多边形内部
- 《自己动手写操作系统》第二章——Bochs调试及相关仿真工具的使用方法