博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片的画画板
阅读量:7112 次
发布时间:2019-06-28

本文共 6347 字,大约阅读时间需要 21 分钟。

布局文件

1 
2
6 7 8
14
20
25

项目代码

1 package cn.itcast.paint;  2   3 import java.io.File;  4 import java.io.FileNotFoundException;  5 import java.io.FileOutputStream;  6 import java.io.InputStream;  7   8 import android.app.Activity;  9 import android.content.Intent; 10 import android.graphics.Bitmap; 11 import android.graphics.BitmapFactory; 12 import android.graphics.Bitmap.CompressFormat; 13 import android.graphics.BitmapFactory.Options; 14 import android.graphics.Canvas; 15 import android.graphics.Color; 16 import android.graphics.Matrix; 17 import android.graphics.Paint; 18 import android.graphics.Rect; 19 import android.net.Uri; 20 import android.os.Bundle; 21 import android.os.Environment; 22 import android.view.Display; 23 import android.view.MotionEvent; 24 import android.view.View; 25 import android.view.View.OnTouchListener; 26 import android.view.WindowManager; 27 import android.widget.ImageView; 28 import android.widget.Toast; 29  30 public class DemoActivity extends Activity { 31     private ImageView iv; 32     private Bitmap alterBitmap; 33     private Canvas canvas; 34     private Paint paint; 35     private WindowManager wm; 36     private Display  display; 37      38     @Override 39     public void onCreate(Bundle savedInstanceState) { 40         super.onCreate(savedInstanceState); 41         setContentView(R.layout.main); 42         iv = (ImageView) findViewById(R.id.iv); 43         paint = new Paint(); 44         paint.setColor(Color.GREEN); 45         paint.setStrokeWidth(10); 46         wm = getWindowManager(); 47         //获取手机的屏幕宽高 48         display = wm.getDefaultDisplay(); 49         iv.setOnTouchListener(new OnTouchListener() { 50             int startx; 51             int starty; 52             @Override 53             public boolean onTouch(View v, MotionEvent event) { 54                 switch (event.getAction()) { 55                 case MotionEvent.ACTION_DOWN://手指第一次触摸屏幕 56                     startx = (int) event.getX(); 57                     starty = (int) event.getY(); 58                      59                     break; 60                 case MotionEvent.ACTION_MOVE: //手指在imageview上中移动 61                     int x = (int) event.getX(); 62                     int y = (int) event.getY(); 63                     canvas.drawLine(startx, starty, x, y, paint); 64                     startx = (int) event.getX(); 65                     starty = (int) event.getY(); 66                     iv.invalidate(); 67                     break; 68                 } 69                  70                  71                  72                 return true; 73             } 74         }); 75     } 76      77      78     public void selectImage(View view){ 79         Intent intent = new Intent(); 80         intent.setAction(Intent.ACTION_PICK); 81         intent.addCategory("android.intent.category.DEFAULT"); 82         intent.setType("image/*"); 83         startActivityForResult(intent, 0); 84     } 85      86      87     @Override 88     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 89         try { 90             if (data != null) { 91                 // 得到点击图片的uri 92                 Uri uri = data.getData(); 93                 //对 要加载的图片进行缩放 94                 //1.得到图片的宽度和高度. 95                 //由于我们只想得到图片的宽度和高度,这个时候 只需要解析图片的头信息 96                 BitmapFactory.Options opts = new Options(); 97                 opts.inJustDecodeBounds = true;//让 bimapfactory假的解析这个位图,只获取位图的边框信息 98                 InputStream is = getContentResolver().openInputStream(uri); 99                 BitmapFactory.decodeStream(is, new Rect(), opts);100                 101                 int bitmapHeight =     opts.outHeight;102                 int bitmapWidth = opts.outWidth;103                 104                 int windowHeight = display.getHeight();105                 int windowWidth = display.getWidth();106                 //获取水平和垂直方向的缩放比107                 int scaley = bitmapHeight / windowHeight;108                 int scalex = bitmapWidth / windowWidth;109                 110                 111                 112                 if(scalex>scaley&&scaley>1){113                     opts.inSampleSize = scalex;114                 }115                 if(scaley>scalex&&scalex>1){116                     opts.inSampleSize = scaley;117                 }118                 opts.inJustDecodeBounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图119                 // 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流120                 is = getContentResolver().openInputStream(uri);121                 Bitmap bitmap =  BitmapFactory.decodeStream(is, new Rect(), opts);122                 System.out.println("位图的高度:"+bitmap.getHeight());123                 System.out.println("位图的宽度:"+bitmap.getWidth());124                 125                 126                 alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());127                 128                 canvas = new Canvas(alterBitmap);129                 130                 canvas.drawBitmap(bitmap, new Matrix(), new Paint());131                 132                 //设置的是原图在内存中的拷贝133                 iv.setImageBitmap(alterBitmap);134             }135         } catch (Exception e) {136             e.printStackTrace();137         }138         super.onActivityResult(requestCode, resultCode, data);139     }140     141     public void saveImage(View view){142         try {143             File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");144             FileOutputStream stream = new FileOutputStream(file);145             alterBitmap.compress(CompressFormat.JPEG, 100, stream);146             Toast.makeText(this, "保存成功", 1).show();147             // 模拟系统发送一个 sd卡挂载的广播 148             Intent intent = new Intent();149             intent.setAction(Intent.ACTION_MEDIA_MOUNTED);150             intent.setData(Uri.parse("file:"+Environment.getExternalStorageDirectory().getAbsolutePath()));151             sendBroadcast(intent); 152         } catch (FileNotFoundException e) {153             Toast.makeText(this, "保存失败", 1).show();154             e.printStackTrace();155         }156     }157 }

 

转载于:https://www.cnblogs.com/developer-wang/archive/2013/01/27/2878888.html

你可能感兴趣的文章
利用PIL库截屏的一个小例子
查看>>
VS2011最新版本 新功能 新增特性 简介Visual Studio 2011
查看>>
HTTP2.0之战
查看>>
Python 深究readline()
查看>>
ref and out in C++/CLI
查看>>
SQLServer With(NoLock)
查看>>
C语言中不定参数函数的使用
查看>>
Ubuntu - No space left on device Is it a lie or have I run out of inodes
查看>>
解决Agent admitted failure to sign using the kye with ssh
查看>>
Linux Doxygen的安装和使用
查看>>
android adb介绍
查看>>
【SQL】SQL中笛卡尔积、内连接、外连接的数据演示
查看>>
HTTP解析
查看>>
MemCache超详细解读
查看>>
python numpy 教程
查看>>
手机web如何实现多平台分享
查看>>
策略模式和观察者模式
查看>>
详解CALayer 和 UIView的区别和联系
查看>>
eclipse中报错:java.lang.OutOfMemoryError: Java heap space
查看>>
Ubuntu 16.04 grub rescue 模式下修复 grub
查看>>