因为很多代码前面五次进阶已经设计,在此不赘述。单列出核心代码。

第一部分:xml文件

一个按钮选择图片,一个按钮保存图片

代码如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <Button 
  8.         android:id="@+id/pickImageBtn" 
  9.         android:layout_width="wrap_content" 
  10.         android:layout_height="wrap_content" 
  11.         android:text="pickImage" /> 
  12.  
  13.     <ImageView 
  14.         android:id="@+id/pickedImage" 
  15.         android:layout_width="wrap_content" 
  16.         android:layout_height="wrap_content" 
  17.         android:src="@drawable/ic_launcher" /> 
  18.  
  19.     <Button 
  20.         android:id="@+id/saveBtn" 
  21.         android:layout_width="wrap_content" 
  22.         android:layout_height="wrap_content" 
  23.         android:text="Save" /> 
  24.  
  25. </LinearLayout> 

第二部分:初始化

代码如下:

  1. public void onCreate(Bundle savedInstanceState) { 
  2.         super.onCreate(savedInstanceState); 
  3.         setContentView(R.layout.main); 
  4.          
  5.         Button pickImageBtn = (Button) findViewById(R.id.pickImageBtn); 
  6.         Button saveBtn = (Button) findViewById(R.id.saveBtn); 
  7.         mImageView = (ImageView) findViewById(R.id.pickedImage); 
  8.          
  9.          
  10.         pickImageBtn.setOnClickListener(this); 
  11.         saveBtn.setOnClickListener(this); 
  12.  
  13.          
  14.     } 

第三部分:选择图片,监听Touch

代码如下:

 

  1. public void onClick(View v) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("bitmap""has onClick"); 
  4.         switch (v.getId()) { 
  5.         case R.id.pickImageBtn: 
  6.             Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
  7.             startActivityForResult(intent, REQUEST_CODE); 
  8.             break

 

  1. @Override 
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
  3.         // TODO Auto-generated method stub 
  4.         super.onActivityResult(requestCode, resultCode, intent); 
  5.         Log.d("bitmap""requestCode is :" + requestCode); 
  6.         if (resultCode == RESULT_OK) { 
  7.             Log.d("bitmap""has result ok"); 
  8.             Uri uri = intent.getData(); 
  9.              
  10.             int dw = getWindowManager().getDefaultDisplay().getWidth(); 
  11.             int dh = getWindowManager().getDefaultDisplay().getHeight(); 
  12.              
  13.             try { 
  14.                 BitmapFactory.Options opts = new BitmapFactory.Options(); 
  15.                 opts.inJustDecodeBounds = true;//如果设置为true,本身不会返回 
  16.                 Bitmap chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); 
  17.                 int bw = opts.outWidth;//此时,chooseBitmap的值为null,但opts仍然获得其config 
  18.                 int bh = opts.outHeight; 
  19.                  
  20.                 int widthRatio = (int) Math.ceil(bw / (float) dw); 
  21.                 int heightRatio = (int) Math.ceil(bh / (float) dh); 
  22.                  
  23.                 if (widthRatio > 1 || heightRatio >1) { 
  24.                     if (widthRatio > heightRatio) { 
  25.                         opts.inSampleSize = widthRatio;//设置比例 
  26.                     } else { 
  27.                         opts.inSampleSize = heightRatio; 
  28.                     } 
  29.                 } 
  30.                 opts.inJustDecodeBounds = false
  31.                 chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); 
  32.                 Log.d("bitmap""chooseBitmap is :" + chooseBitmap); 
  33.                  
  34.                 alteredBitmap = Bitmap.createBitmap(chooseBitmap.getWidth(), chooseBitmap.getHeight(), chooseBitmap.getConfig()); 
  35.                 canvas = new Canvas(alteredBitmap);//画布 
  36.                 paint = new Paint();         
  37.                 paint.setColor(Color.WHITE); 
  38.                 paint.setStyle(Style.STROKE); 
  39.                 Matrix matrix = new Matrix(); 
  40.                 canvas.drawBitmap(chooseBitmap, matrix , paint); 
  41.                  
  42.                 mImageView.setImageBitmap(alteredBitmap); 
  43.                 mImageView.setOnTouchListener(this);//设置监听 
  44.                  
  45.             } catch (FileNotFoundException e) { 
  46.                 // TODO Auto-generated catch block 
  47.                 e.printStackTrace(); 
  48.             } 
  49.              
  50.              
  51.              
  52.         } 
  53.          
  54.     } 

 

第四部分:在图片上触摸移动,实时绘制。

代码如下:

  1. public boolean onTouch(View v, MotionEvent event) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("touch_draw""ontouch()"); 
  4.          
  5.         switch (event.getAction()) { 
  6.         case MotionEvent.ACTION_UP: 
  7. //          upX = event.getX(); 
  8. //          upY = event.getY();//画直线的相关代码,可自己测试。同理,画圆椭圆都可在相关方法里设置 
  9. //          canvas.drawLine(downX, downY, upX, upY, paint); 
  10. //          mImageView.invalidate(); 
  11. //          break; 
  12.         case MotionEvent.ACTION_DOWN: 
  13.             downX = event.getX(); 
  14.             downY = event.getY(); 
  15.             break
  16.         case MotionEvent.ACTION_MOVE: 
  17.             upX = event.getX(); 
  18.             upY = event.getY(); 
  19.             canvas.drawLine(downX, downY, upX, upY, paint); 
  20.             mImageView.invalidate(); 
  21.             downX = upX; 
  22.             downY = upY; 
  23.             break
  24.         case MotionEvent.ACTION_CANCEL: 
  25.             break
  26.  
  27.         } 
  28.          
  29.         return true
  30.     } 

第五部分:保存图片

代码如下:

 

  1. public void onClick(View v) { 
  2.         // TODO Auto-generated method stub 
  3.         Log.d("bitmap""has onClick"); 
  4.         switch (v.getId()) { 
  5.         case R.id.pickImageBtn: 
  6.             Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
  7.             startActivityForResult(intent, REQUEST_CODE); 
  8.             break
  9.         case R.id.saveBtn://保存已经涂鸦过的图片 
  10.              
  11.              
  12.             /* 
  13.              * PNG :非常适合艺术线条和图形:始终保持所有数据 
  14.              * JPEG:非常适合带渐变的全彩图像,例如照片。是“有损的”编解码器,可设置质量 
  15.              */ 
  16.  
  17.              
  18.             if (null != alteredBitmap) { 
  19.                 Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());//创建一个新的uri 
  20.                  
  21.                 try { 
  22.                      OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);//输出流 
  23.                       
  24.                      alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS);//生成图片 
  25.                       
  26.                      Toast.makeText(this"has saved", Toast.LENGTH_SHORT).show(); 
  27.                       
  28.                 } catch (FileNotFoundException e) { 
  29.                     // TODO Auto-generated catch block 
  30.                     e.printStackTrace(); 
  31.                 } 
  32.             } 
  33.             break
  34.         } 
  35.     }