android 下载图片保存在sdcard并显示可拖动缩放
java代码
1 package com.example.catchlong; 2 import java.io.BufferedOutputStream; 3 import java.io.ByteArrayOutputStream; 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.HttpURLConnection; 9 import java.net.URL; 10 11 import android.annotation.SuppressLint; 12 import android.annotation.TargetApi; 13 import android.app.Activity; 14 import android.content.Context; 15 import android.graphics.Bitmap; 16 import android.graphics.BitmapFactory; 17 import android.graphics.Canvas; 18 import android.graphics.Color; 19 import android.graphics.Matrix; 20 import android.graphics.Paint; 21 import android.graphics.PointF; 22 import android.os.Bundle; 23 import android.util.DisplayMetrics; 24 import android.util.FloatMath; 25 import android.util.Log; 26 import android.view.GestureDetector; 27 import android.view.MotionEvent; 28 import android.view.View; 29 import android.view.GestureDetector.OnGestureListener; 30 import android.view.View.OnTouchListener; 31 import android.view.animation.AnimationUtils; 32 import android.widget.ImageView; 33 import android.widget.Toast; 34 35 @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" }) 36 @TargetApi(5) 37 public class ImageActivity extends Activity implements OnTouchListener { 38 //implements OnTouchListener { 39 private ImageView imgview; 40 private ImageView img; 41 42 43 private Matrix matrix=new Matrix(); 44 private Matrix savedMatrix=new Matrix(); 45 46 static final int NONE = 0; 47 static final int DRAG = 1; 48 static final int ZOOM = 2; 49 int mode = NONE; 50 51 // Remember some things for zooming 52 PointF start = new PointF(); 53 PointF mid = new PointF(); 54 float oldDist = 1f; 55 56 //private GestureDetector gesture; 57 @Override 58 protected void onCreate(Bundle savedInstanceState) { 59 // TODO Auto-generated method stub 60 super.onCreate(savedInstanceState); 61 this.setContentView(R.layout.imagectrl); 62 imgview=(ImageView)this.findViewById(R.id.imag); 63 downloadImage(); 64 //imgview.setAnimation(AnimationUtils.loadAnimation(this, R.anim.newanim)); 65 66 67 img=(ImageView)this.findViewById(R.id.imag); 68 Matrix mt=img.getImageMatrix(); 69 //mt.postRotate(30); 70 mt.postScale(0.5f,0.5f);mt.postScale(1.5f,1.5f); 71 //mt.postRotate(30, 130, 100); 72 mt.postTranslate(100, 10); 73 74 img.setImageMatrix(mt); 75 76 77 //imgview.setLongClickable(true); 78 79 //imgview.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.xieer_1)); 80 imgview.setOnTouchListener(this); 81 imgview.setLongClickable(true); 82 83 } 84 private float spacing(MotionEvent event) { 85 float x = event.getX(0) - event.getX(1); 86 float y = event.getY(0) - event.getY(1); 87 return FloatMath.sqrt(x * x + y * y); 88 } 89 90 91 private void midPoint(PointF point, MotionEvent event) { 92 float x = event.getX(0) + event.getX(1); 93 float y = event.getY(0) + event.getY(1); 94 point.set(x / 2, y / 2); 95 } 96 97 @TargetApi(8) 98 public boolean onTouch(View v, MotionEvent event) { 99 // TODO Auto-generated method stub 100 /* 101 Log.d("Infor", "类别:"+event.getAction()); 102 Log.d("Infor", "mask:"+event.getActionMasked()); 103 Log.d("Infor", "index:"+event.getActionIndex()); 104 Log.d("Infor", "points:"+event.getPointerCount());*/ 105 Log.d("Infor", "size:"+event.getSize()); 106 if(event.getActionMasked()==MotionEvent.ACTION_POINTER_UP) 107 Log.d("Infor", "多点操作"); 108 switch(event.getActionMasked()){ 109 case MotionEvent.ACTION_DOWN: 110 matrix.set(imgview.getImageMatrix()); 111 savedMatrix.set(matrix); 112 start.set(event.getX(),event.getY()); 113 Log.d("Infor", "触摸了..."); 114 mode=DRAG; 115 break; 116 case MotionEvent.ACTION_POINTER_DOWN: //多点触控 117 oldDist=this.spacing(event); 118 if(oldDist>10f){ 119 Log.d("Infor", "oldDist"+oldDist); 120 savedMatrix.set(matrix); 121 midPoint(mid,event); 122 mode=ZOOM; 123 } 124 break; 125 case MotionEvent.ACTION_POINTER_UP: 126 mode=NONE; 127 break; 128 case MotionEvent.ACTION_MOVE: 129 if(mode==DRAG){ //此实现图片的拖动功能... 130 matrix.set(savedMatrix); 131 matrix.postTranslate(event.getX()-start.x, event.getY()-start.y); 132 } 133 else if(mode==ZOOM){// 此实现图片的缩放功能... 134 float newDist=spacing(event); 135 if(newDist>10){ 136 matrix.set(savedMatrix); 137 float scale=newDist/oldDist; 138 matrix.postScale(scale, scale, mid.x, mid.y); 139 } 140 } 141 break; 142 } 143 imgview.setImageMatrix(matrix); 144 return false; 145 } 146 private void downloadImage(){ 147 148 String filePath= "http://img.jdxi.net/upload/2012/9/201209011610355146.jpg"; 149 150 @SuppressWarnings("unused") 151 String imgName ="liying.jpg"; 152 153 //使用【方法1】取得的是InputStream,直接从InputStream生成bitmap 154 155 try{ 156 157 Bitmap bitmap = BitmapFactory.decodeStream(getImageStream(filePath)); 158 159 if(bitmap!=null){ 160 161 saveFile(bitmap, "liying.jpg"); //调用保存方法 162 163 String str2 = "/sdcard/mbookyang/liying.jpg"; 164 165 File file = new File(str2); 166 167 if(file.exists()){ //判断文件是否存在 168 169 Bitmap bm = BitmapFactory.decodeFile(str2); 170 //由File获取图片并转为Bitmap 171 172 imgview.setImageBitmap(bm); 173 174 } 175 176 } 177 178 } 179 180 catch(Exception e) { 181 Toast.makeText(ImageActivity.this,"下载图片失败", Toast.LENGTH_SHORT).show(); 182 183 e.printStackTrace(); 184 185 } 186 187 188 189 } 190 191 192 193 //方法1 194 195 public InputStream getImageStream(String path)throws Exception{ 196 197 URL url = new URL(path); 198 199 HttpURLConnection conn =(HttpURLConnection) url.openConnection(); 200 201 conn.setConnectTimeout(5 * 1000); //设定超时 202 203 conn.setRequestMethod("GET"); //GET为下载,POST为上传 204 205 if(conn.getResponseCode()== HttpURLConnection.HTTP_OK){ 206 207 return conn.getInputStream(); //获得数据流 208 209 } 210 211 return null; 212 213 } 214 215 216 217 //方法2 218 219 public byte[] getImage(String path) throws Exception{ 220 221 URL url = new URL(path); 222 223 HttpURLConnection conn =(HttpURLConnection) url.openConnection(); 224 225 conn.setConnectTimeout(5 * 1000); 226 227 conn.setRequestMethod("GET"); 228 229 InputStream inStream = conn.getInputStream(); 230 231 if(conn.getResponseCode()== HttpURLConnection.HTTP_OK){ 232 233 return readStream(inStream); 234 235 } 236 237 return null; 238 239 } 240 241 public static byte[] readStream(InputStream inStream)throws Exception{ 242 243 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 244 245 byte[]buffer =new byte[1024]; 246 247 int len =0; 248 249 while((len=inStream.read(buffer)) != -1){ 250 251 outStream.write(buffer, 0, len); 252 253 } 254 255 outStream.close(); 256 257 inStream.close(); 258 259 return outStream.toByteArray(); 260 261 } 262 263 264 265 //保存Bitmap为图片文件 266 267 public void saveFile(Bitmap bitmap, String fileName) throws IOException { 268 269 File dirFile = new File("/sdcard/mbookyang"); 270 271 if(!dirFile.exists()){ //判断路径是否存在,不存在则创建 272 273 dirFile.mkdir(); 274 275 } 276 277 File savePath = new File("/sdcard/mbookyang/" + fileName); //保存路径 278 279 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(savePath)); 280 281 bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); //质量压缩为80% 282 283 bos.flush(); 284 285 bos.close(); 286 287 } 288 289 }