Android绘制进阶之六:触摸轨迹的绘制及图片的保存
2012-04-10 16:44
501 查看
因为很多代码前面五次进阶已经设计,在此不赘述。单列出核心代码。
第一部分:xml文件
一个按钮选择图片,一个按钮保存图片
代码如下:
第二部分:初始化
代码如下:
第三部分:选择图片,监听Touch
代码如下:
第四部分:在图片上触摸移动,实时绘制。
代码如下:
第五部分:保存图片
代码如下:
第一部分:xml文件
一个按钮选择图片,一个按钮保存图片
代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/pickImageBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="pickImage" /> <ImageView android:id="@+id/pickedImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/saveBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Save" /> </LinearLayout>
第二部分:初始化
代码如下:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button pickImageBtn = (Button) findViewById(R.id.pickImageBtn); Button saveBtn = (Button) findViewById(R.id.saveBtn); mImageView = (ImageView) findViewById(R.id.pickedImage); pickImageBtn.setOnClickListener(this); saveBtn.setOnClickListener(this); }
第三部分:选择图片,监听Touch
代码如下:
public void onClick(View v) { // TODO Auto-generated method stub Log.d("bitmap", "has onClick"); switch (v.getId()) { case R.id.pickImageBtn: Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE); break;
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, intent); Log.d("bitmap", "requestCode is :" + requestCode); if (resultCode == RESULT_OK) { Log.d("bitmap", "has result ok"); Uri uri = intent.getData(); int dw = getWindowManager().getDefaultDisplay().getWidth(); int dh = getWindowManager().getDefaultDisplay().getHeight(); try { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;//如果设置为true,本身不会返回 Bitmap chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); int bw = opts.outWidth;//此时,chooseBitmap的值为null,但opts仍然获得其config int bh = opts.outHeight; int widthRatio = (int) Math.ceil(bw / (float) dw); int heightRatio = (int) Math.ceil(bh / (float) dh); if (widthRatio > 1 || heightRatio >1) { if (widthRatio > heightRatio) { opts.inSampleSize = widthRatio;//设置比例 } else { opts.inSampleSize = heightRatio; } } opts.inJustDecodeBounds = false; chooseBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, opts); Log.d("bitmap", "chooseBitmap is :" + chooseBitmap); alteredBitmap = Bitmap.createBitmap(chooseBitmap.getWidth(), chooseBitmap.getHeight(), chooseBitmap.getConfig()); canvas = new Canvas(alteredBitmap);//画布 paint = new Paint(); paint.setColor(Color.WHITE); paint.setStyle(Style.STROKE); Matrix matrix = new Matrix(); canvas.drawBitmap(chooseBitmap, matrix , paint); mImageView.setImageBitmap(alteredBitmap); mImageView.setOnTouchListener(this);//设置监听 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第四部分:在图片上触摸移动,实时绘制。
代码如下:
public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Log.d("touch_draw", "ontouch()"); switch (event.getAction()) { case MotionEvent.ACTION_UP: // upX = event.getX(); // upY = event.getY();//画直线的相关代码,可自己测试。同理,画圆椭圆都可在相关方法里设置 // canvas.drawLine(downX, downY, upX, upY, paint); // mImageView.invalidate(); // break; case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); break; case MotionEvent.ACTION_MOVE: upX = event.getX(); upY = event.getY(); canvas.drawLine(downX, downY, upX, upY, paint); mImageView.invalidate(); downX = upX; downY = upY; break; case MotionEvent.ACTION_CANCEL: break; } return true; }
第五部分:保存图片
代码如下:
public void onClick(View v) { // TODO Auto-generated method stub Log.d("bitmap", "has onClick"); switch (v.getId()) { case R.id.pickImageBtn: Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE); break;case R.id.saveBtn://保存已经涂鸦过的图片
/*
* PNG :非常适合艺术线条和图形:始终保持所有数据
* JPEG:非常适合带渐变的全彩图像,例如照片。是“有损的”编解码器,可设置质量
*/
if (null != alteredBitmap) {
Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());//创建一个新的uri
try {
OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);//输出流
alteredBitmap.compress(CompressFormat.JPEG, 90, imageFileOS);//生成图片
Toast.makeText(this, "has saved", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
}
相关文章推荐
- Android 绘图进阶(三):Xfermode绘制图片的保存
- Android 绘制手势路线制作图画板并把View保存为图片
- 触摸轨迹绘图并保存图片
- Android 如何将Canvas上绘制的内容保存成本地图片(转)
- android图像绘制(五)——画布保存为图片
- 解决Android SurfaceView绘制触摸轨迹闪烁问题的方法
- android图像绘制(五)——画布保存为图片
- android,保存绘制的图片
- android图像绘制(五)画布保存为指定格式/大小的图片
- Android游戏开发中绘制游戏触摸轨迹的曲线图
- Android 游戏开发中绘制游戏触摸轨迹的曲线图
- Android 如何将Canvas上绘制的内容保存成本地图片
- Android进阶——Sharedpreferences保存对象和图片等复杂类型的数据
- Android 玩转图片(读取图片转化Bitmap,保存本地,采样压缩)
- Androin学习笔记五十四: android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
- Android 图片Bitmap保存到内存卡
- 【Android进阶】如何使用文件来保存程序中的数据
- android 从Imgeview中获取显示的图片不获取背景图片怎么获取,我用getDrawingCache()方法获取图片保存后背景图片也一起保存了。
- Android人脸识别Demo竖屏YUV方向调整和图片保存(分享)
- Android ImageUtils 图片工具类,包括:小米从相册调图像空指针,三星旋转照片,压缩图片,保存Bitmap到本地,获取本地视频的缩略图,毛化玻璃效果,代码以后会更新