虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Android编程 > Android绘制进阶之六:触摸轨迹的绘制及图片的保存

Android绘制进阶之六:触摸轨迹的绘制及图片的保存
类别:Android编程   作者:码皇   来源:互联网   点击:

因为很多代码前面五次进阶已经设计,在此不赘述。单列出核心代码。第一部分:xml文件一个按钮选择图片,一个按钮保存图片代码如下:1 <?xml version="1 0" encoding="utf-8"?>2 <LinearLayout xmlns:android=

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

 
摘自 小新专栏

相关热词搜索: Android 绘制 阶之