android开发获取网络图片并可拖拽移动

这一篇讲获取网络图片,然后显示出来,并对其操作,如拖拽,放大,缩小,移动。

首先,先访问网络图片,代码如下:

先定义一个线程,因为在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{
		@Override
		public 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{
		@Override
		public 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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值