android多媒体图片mediaStore

界面首先由一个choosePicture的按钮,用来从MediaStore取得图片,取得之后,可以在图片上进行绘画,再点击savebutton就可以保存图片到MediaStore。

界面xml文件:

[html] view plaincopyprint?

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  2. android:layout_width="match_parent"

  3. android:layout_height="match_parent"

  4. android:orientation="vertical" >

  5. <Button

  6. android:id="@+id/chooseButton"

  7. android:layout_width="fill_parent"

  8. android:layout_height="wrap_content"

  9. android:gravity="center_horizontal"

  10. android:text="@string/choose" />

  11. <ImageView

  12. android:id="@+id/imageView"

  13. android:layout_width="wrap_content"

  14. android:layout_height="wrap_content"

  15. android:layout_gravity="center_horizontal|center_vertical|center"

  16. android:contentDescription="@string/contentDes" />

  17. <Button

  18. android:id="@+id/saveButton"

  19. android:layout_width="wrap_content"

  20. android:layout_height="wrap_content"

  21. android:gravity="center_horizontal"

  22. android:layout_gravity="right|bottom"

  23. android:text="@string/save" />

  24. </LinearLayout>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/chooseButton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_horizontal"android:text="@string/choose"/><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal|center_vertical|center"android:contentDescription="@string/contentDes"/><Buttonandroid:id="@+id/saveButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:layout_gravity="right|bottom"android:text="@string/save"/></LinearLayout>

string.xml文件定义使用的一些字符串:

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>

  2. <resources>

  3. <string name="app_name">Scrawl</string>

  4. <string name="action_settings">Settings</string>

  5. <string name="hello_world">Hello world!</string>

  6. <string name="choose">选择图片</string>

  7. <string name="contentDes">图片描述</string>

  8. <string name="save">保存图片</string>

  9. <string name="pleaseChooseImage">请选择图片</string>

  10. <string name="saveSuccess">保存图片成功</string>

  11. </resources>

<?xmlversion="1.0"encoding="utf-8"?><resources><stringname="app_name">Scrawl</string><stringname="action_settings">Settings</string><stringname="hello_world">Helloworld!</string><stringname="choose">选择图片</string><stringname="contentDes">图片描述</string><stringname="save">保存图片</string><stringname="pleaseChooseImage">请选择图片</string><stringname="saveSuccess">保存图片成功</string></resources>

在dimens.xml中定义了margin的top和bottom值为16dp:

[html] view plaincopyprint?

  1. <resources>

  2. <!-- Default screen margins, per the Android Design guidelines. -->

  3. <dimen name="activity_horizontal_margin">16dp</dimen>

  4. <dimen name="activity_vertical_margin">16dp</dimen>

  5. </resources>

<resources><!--Defaultscreenmargins,pertheAndroidDesignguidelines.--><dimenname="activity_horizontal_margin">16dp</dimen><dimenname="activity_vertical_margin">16dp</dimen></resources>

主程序:

[java] view plaincopyprint?

  1. package cn.yh.scrawl;

  2. import java.io.FileNotFoundException;

  3. import java.io.OutputStream;

  4. import android.app.Activity;

  5. import android.content.ContentValues;

  6. import android.content.Intent;

  7. import android.graphics.Bitmap;

  8. import android.graphics.Bitmap.CompressFormat;

  9. import android.graphics.BitmapFactory;

  10. import android.graphics.BitmapFactory.Options;

  11. import android.graphics.Canvas;

  12. import android.graphics.Color;

  13. import android.graphics.Matrix;

  14. import android.graphics.Paint;

  15. import android.net.Uri;

  16. import android.os.Bundle;

  17. import android.provider.MediaStore.Images.Media;

  18. import android.util.Log;

  19. import android.view.Display;

  20. import android.view.Menu;

  21. import android.view.MotionEvent;

  22. import android.view.View;

  23. import android.view.View.OnClickListener;

  24. import android.view.View.OnTouchListener;

  25. import android.view.Window;

  26. import android.widget.Button;

  27. import android.widget.ImageView;

  28. import android.widget.Toast;

  29. public class MainActivity extends Activity implements OnClickListener,

  30. OnTouchListener {

  31. private static final int CHOOSEPICTURE_REQUESTCODE = 0;

  32. private static final String TAG = "Scrawl";

  33. // �@示�D片的�M件。

  34. private ImageView imageView;

  35. // �x��D片的按�o,和保存�D片的按�o。

  36. private Button chooseButton, saveButton;

  37. // 定�x���位�D�ο螅�第一��包含了�x�穸�D片的�s放版本,第二��是可�的版本,

  38. // �⒌谝��位�D�ο罄L�u到第二��位�D�ο笾校�再在其上方�L�u(�T�f)

  39. private Bitmap bitmap, alteredBitmap;

  40. // 定�x��布

  41. private Canvas canvas;

  42. // 定�x���P

  43. private Paint paint;

  44. // 定�x�入矩�,��使之在一幅�D像上��用空�g�D�Q(比如旋�D,�u�h,�s放,裁剪等)

  45. private Matrix matrix;

  46. // 定�x按下和停止的位置(x,y)座��

  47. private float downX = 0, downY = 0, upX = 0, upY = 0;

  48. @Override

  49. protected void onCreate(Bundle savedInstanceState) {

  50. super.onCreate(savedInstanceState);

  51. // �O置主��面

  52. setContentView(R.layout.activity_main);

  53. // �@取��面xml文件相�P的View�ο�

  54. imageView = (ImageView) findViewById(R.id.imageView);

  55. chooseButton = (Button) findViewById(R.id.chooseButton);

  56. saveButton = (Button) findViewById(R.id.saveButton);

  57. // �o���Button�O置onClick�O�事件,�����F了android.view.View.OnClickListener接口

  58. chooseButton.setOnClickListener(this);

  59. saveButton.setOnClickListener(this);

  60. // �oImageView�ο笤O置onTouch�O�,�����F了android.view.View.OnTouchListener接口

  61. imageView.setOnTouchListener(this);

  62. // ��_始,�O置saveButton�椴豢捎��B

  63. saveButton.setEnabled(false);

  64. }

  65. @Override

  66. public boolean onCreateOptionsMenu(Menu menu) {

  67. // Inflate the menu; this adds items to the action bar if it is present.

  68. getMenuInflater().inflate(R.menu.main, menu);

  69. return true;

  70. }

  71. @Override

  72. public void onClick(View v) {

  73. // TODO Auto-generated method stub

  74. // 因�榻o不同的Button�ο蠖荚O置了onClick�O�,所以需要判�嘤|�l的是哪��Button的�O�事件

  75. switch (v.getId()) {

  76. case R.id.chooseButton:

  77. // 再一次选择图片,�O置saveButton�椴豢捎��B

  78. if (saveButton.isEnabled())

  79. saveButton.setEnabled(false);

  80. // 使用Intent打�_Gallery�x��D片

  81. Intent choosePictureIntent = new Intent(

  82. Intent.ACTION_PICK,

  83. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

  84. // ��釉�activity,并在�activity�Y束返回���,所以�{用startActivityForResult()方法

  85. startActivityForResult(choosePictureIntent,

  86. CHOOSEPICTURE_REQUESTCODE);

  87. break;

  88. case R.id.saveButton:

  89. if (alteredBitmap != null) {

  90. Uri imageFileUri = getContentResolver().insert(

  91. Media.EXTERNAL_CONTENT_URI, new ContentValues());

  92. try {

  93. OutputStream imageFileOS = getContentResolver()

  94. .openOutputStream(imageFileUri);

  95. //compress方法,压缩成jpg格式,0-100代表了压缩质量 100质量最好 第三个参数把压缩图片写到输出流

  96. alteredBitmap

  97. .compress(CompressFormat.JPEG, 90, imageFileOS);

  98. //保存成功,进行提示

  99. Toast.makeText(this, R.string.saveSuccess,

  100. Toast.LENGTH_LONG).show();

  101. } catch (FileNotFoundException e) {

  102. // TODO Auto-generated catch block

  103. e.printStackTrace();

  104. }

  105. } else {

  106. Toast.makeText(this, R.string.pleaseChooseImage,

  107. Toast.LENGTH_LONG).show();

  108. }

  109. break;

  110. }

  111. }

  112. @Override

  113. protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  114. // TODO Auto-generated method stub

  115. super.onActivityResult(requestCode, resultCode, data);

  116. // 判�喾祷厥欠�OK

  117. if (resultCode == RESULT_OK) {

  118. // �@取返回的Uri

  119. Uri imageFileUri = data.getData();

  120. // �@取默�JDisplay,用以得到��前的��和高

  121. Display currentDisplay = getWindowManager().getDefaultDisplay();

  122. int dw = currentDisplay.getWidth();

  123. Log.i(TAG, currentDisplay.getHeight()+"");

  124. Log.i(TAG, chooseButton.getHeight()+"chooseButton");

  125. Log.i(TAG, saveButton.getHeight()+"saveButton");

  126. Log.i(TAG, imageView.getHeight()+"imageView");

  127. Log.i(TAG, getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop()+"ID_ANDROID_CONTENT");

  128. //432 = 48+48+40+16*2+264 默认界面的margin top bottom有16dp title和状态栏40dp 48+48 两个button高度

  129. int dh = currentDisplay.getHeight() - (48+48+40+16*2);

  130. // chooseButton.getHeight()

  131. // - saveButton.getHeight();

  132. // 使用BitmapFactory��建位�DOptions

  133. BitmapFactory.Options bmFactoryOptions = new Options();

  134. // �O置只是�@取�D片的尺寸,�K不是真正的解�a�D片

  135. bmFactoryOptions.inJustDecodeBounds = true;

  136. // 使用decode*方法��建位�D,getContentResolver()�@取�热萏峁┢�

  137. try {

  138. bitmap = BitmapFactory.decodeStream(getContentResolver()

  139. .openInputStream(imageFileUri), null, bmFactoryOptions);

  140. } catch (FileNotFoundException e) {

  141. // TODO Auto-generated catch block

  142. e.printStackTrace();

  143. }

  144. // �算�D像��高�c��前��高的比率

  145. int hRatio = (int) Math.ceil(bmFactoryOptions.outHeight

  146. / (float) dh);

  147. int wRatio = (int) Math

  148. .ceil(bmFactoryOptions.outWidth / (float) dw);

  149. // 判断是按高比率缩放还是宽比例缩放

  150. if (hRatio > 1 || wRatio > 1) {

  151. if (hRatio > wRatio) {

  152. bmFactoryOptions.inSampleSize = hRatio;

  153. } else {

  154. bmFactoryOptions.inSampleSize = wRatio;

  155. }

  156. }

  157. Log.i(TAG, bmFactoryOptions.outHeight/hRatio+"imageView");

  158. // 对图像进行真正的解码

  159. bmFactoryOptions.inJustDecodeBounds = false;

  160. try {

  161. bitmap = BitmapFactory.decodeStream(getContentResolver()

  162. .openInputStream(imageFileUri), null, bmFactoryOptions);

  163. } catch (FileNotFoundException e) {

  164. // TODO Auto-generated catch block

  165. e.printStackTrace();

  166. }

  167. // 在加�d位�D之後,��建一��可�的位�D�ο�alteredBitmap,�K在其中�L�ubitmap�ο�

  168. alteredBitmap = Bitmap.createBitmap(bitmap.getWidth(),

  169. bitmap.getHeight(), bitmap.getConfig());

  170. // 使用alteredBitmap作���造��担���建canvas

  171. canvas = new Canvas(alteredBitmap);

  172. // ��建���P

  173. paint = new Paint();

  174. // �O置���P�色��Color.WHITE

  175. paint.setColor(Color.WHITE);

  176. // �O置���P大小

  177. paint.setStrokeWidth(5);

  178. // ��建matrix,此���D像不�M行任何的�s放,旋�D等操作

  179. matrix = new Matrix();

  180. // �L�ubitmap

  181. canvas.drawBitmap(bitmap, matrix, paint);

  182. // 把alteredBitmap�O置到imageview上面

  183. imageView.setImageBitmap(alteredBitmap);

  184. // 此�r�O置saveButton�榭捎��B

  185. saveButton.setEnabled(true);

  186. imageView.setOnClickListener(this);

  187. }

  188. }

  189. @Override

  190. public boolean onTouch(View v, MotionEvent event) {

  191. // TODO Auto-generated method stub

  192. int action = event.getAction();

  193. // 判�嗖煌���B

  194. switch (action) {

  195. case MotionEvent.ACTION_DOWN:

  196. // 按下�r��座��

  197. downX = event.getX();

  198. downY = event.getY();

  199. break;

  200. case MotionEvent.ACTION_MOVE:

  201. // 移�舆^程中,不�嗬L�uLine

  202. upX = event.getX();

  203. upY = event.getY();

  204. canvas.drawLine(downX, downY, upX, upY, paint);

  205. imageView.invalidate();

  206. downX = upX;

  207. downY = upY;

  208. break;

  209. case MotionEvent.ACTION_UP:

  210. // 停止�r,��座��

  211. upX = event.getX();

  212. upY = event.getY();

  213. canvas.drawLine(downX, downY, upX, upY, paint);

  214. imageView.invalidate();

  215. break;

  216. case MotionEvent.ACTION_CANCEL:

  217. break;

  218. default:

  219. break;

  220. }

  221. //返回true表示,一旦事件开始就要继续接受触摸事件

  222. return true;

  223. }

  224. }

转载网址:http://blog.csdn.net/yhcelebrite/article/details/11786853

更多相关文章

  1. Android中截取当前屏幕图片
  2. Android(安卓)NestedScrolling机制完全解析 带你玩转嵌套滑动
  3. Android(安卓)开发艺术探索笔记(十三) 之 Window 和 WindowManager
  4. android文件的写入与读取---简单的文本读写
  5. Android(安卓)EventBus的简单使用
  6. Android——事件分发机制
  7. [置顶] android ScrollView,ListView 截屏并保存到图库
  8. android之recyclerview的基本使用
  9. Android(安卓)3.0 r1 API中文文档(113) ――SlidingDrawer

随机推荐

  1. Apache+PHP 配置随笔
  2. Contenteditable / Jquery / Ajax / PHP
  3. 有没有办法在PDO中设置默认游标类型(特别
  4. 如何在数组中存储产品数量
  5. Jquery无刷新编辑——简单篇
  6. php 从指定数字中获取随机组合的方法
  7. json_decode无法在php中运行
  8. 来自多个文件的相同元素DomDocument load
  9. 获取最近7天的一周中的哪一天?
  10. CakePHP2 Request请求对象中文教程