灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2662回复:0

Android绘制进阶之六:触摸轨迹的绘制及图片的保存

楼主#
更多 发布于:2012-09-06 13:51

因为很多代码前面五次进阶已经设计,在此不赘述。单列出核心代码。
第一部分: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.         Androidrc="@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.     }

喜欢0 评分0
游客

返回顶部