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