展会信息港展会大全

Android绘制进阶之六:触摸轨迹的绘制及图片的保存
来源:互联网   发布日期:2015-09-29 10:38:40   浏览:3311次  

导读:因为很多代码前面五次进阶已经设计,在此不赘述。单列出核心代码。第一部分:xml文件一个按钮选择图片,一个按钮保存图片代码如下:1.<?xml version="1.0" encodi...

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

第一部分: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开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港