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