layout:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.example.paint.MainActivity" >
  7.  
  8. <Button
  9. android:onClick="save"
  10. android:id="@+id/btn"
  11. android:layout_width="fill_parent"
  12. android:layout_height="wrap_content"
  13. android:text="保存" />
  14. <Button
  15. android:onClick="selectImage"
  16. android:id="@+id/select"
  17. android:layout_width="fill_parent"
  18. android:layout_height="wrap_content"
  19. android:text="选择一个图片" />
  20.  
  21. <ImageView
  22. android:layout_above="@id/select"
  23. android:id="@+id/iv"
  24. android:layout_width="fill_parent"
  25. android:layout_height="fill_parent"
  26. />
  27. </LinearLayout>

main_activity

  1. package com.example.paint;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5.  
  6. import android.content.Intent;
  7. import android.graphics.Bitmap;
  8. import android.graphics.Bitmap.CompressFormat;
  9. import android.graphics.Bitmap.Config;
  10. import android.graphics.Canvas;
  11. import android.graphics.Color;
  12. import android.graphics.Paint;
  13. import android.net.Uri;
  14. import android.os.Bundle;
  15. import android.os.Environment;
  16. import android.support.v7.app.ActionBarActivity;
  17. import android.view.MotionEvent;
  18. import android.view.View;
  19. import android.view.View.OnTouchListener;
  20. import android.widget.ImageView;
  21. import android.widget.Toast;
  22.  
  23. public class MainActivity extends ActionBarActivity {
  24.  
  25. private ImageView iv;
  26.  
  27. private Bitmap baseBitmap;
  28.  
  29. private Canvas canvas; //画布
  30.  
  31. private Paint paint; //画笔
  32.  
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. setContentView(R.layout.activity_main);
  37.  
  38. paint = new Paint();
  39. //画笔宽度
  40. paint.setStrokeWidth(5);
  41. //画笔颜色
  42. paint.setColor(Color.GREEN);
  43.  
  44. //创建一个可以修改的bitmap
  45. baseBitmap = Bitmap.createBitmap(320, 350, Config.ARGB_8888);
  46. //创建一个画布
  47. canvas = new Canvas(baseBitmap);
  48. //设置背景色
  49. canvas.drawColor(Color.WHITE);
  50.  
  51. iv = (ImageView)findViewById(R.id.iv);
  52.  
  53. //知道用户手指在平美国上移动的轨迹
  54. iv.setOnTouchListener(new OnTouchListener() {
  55. //获取手指开始位置的坐标
  56. int startX;
  57. int startY;
  58. @Override
  59. public boolean onTouch(View v, MotionEvent event) {
  60.  
  61. switch(event.getAction())
  62. {
  63. case MotionEvent.ACTION_DOWN: //手指第一次接触屏幕
  64.  
  65. startX = (int)event.getX();
  66. startY = (int)event.getY();
  67. break;
  68. case MotionEvent.ACTION_MOVE: //手指在屏幕上移动
  69.  
  70. int newX = (int)event.getX();
  71. int newY = (int)event.getY();
  72. //画线
  73. canvas.drawLine(startX, startY, newY, newY, paint);
  74.  
  75. //重新更新画笔开始位置
  76. startX = (int)event.getX();
  77. startY = (int)event.getY();
  78. iv.setImageBitmap(baseBitmap);
  79. break;
  80. case MotionEvent.ACTION_UP: //手指离开屏幕的动作
  81.  
  82. break;
  83.  
  84. }
  85.  
  86. //return true 表示画笔一直触动
  87. return true;
  88. }
  89.  
  90. });
  91. }
  92.  
  93. public void selectImage(View view)
  94. {
  95. Intent intent = new Intent();
  96. intent.setAction(Intent.ACTION_PICK);
  97. intent.setType("image/*");
  98. startActivityForResult(intent, 0);
  99.  
  100. }
  101.  
  102. @Override
  103. protected void onActivityResult(int arg0, int arg1, Intent data) {
  104. if(data!=null)
  105. {
  106.  
  107. Uri uri = data.getData();
  108. Bitmap bitmap = data.getParcelableExtra("data");
  109. baseBitmap = bitmap;
  110. iv.setImageURI(uri);
  111.  
  112. }
  113. super.onActivityResult(arg0, arg1, data);
  114. }
  115.  
  116. public void save(View view)
  117. {
  118. try {
  119.  
  120. File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
  121. FileOutputStream fos = new FileOutputStream(file);
  122. //保存图片
  123. baseBitmap.compress(CompressFormat.JPEG, 100, fos);
  124.  
  125. Toast.makeText(this, "保存图片成功", 0).show();
  126.  
  127. //模拟一个消息通知系统sd卡被重新挂载
  128. Intent intent = new Intent();
  129. intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
  130. intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
  131. sendBroadcast(intent);
  132.  
  133. } catch (Exception e) {
  134. Toast.makeText(this, "保存图片失败", 0).show();
  135. e.printStackTrace();
  136. }
  137.  
  138. }
  139.  
  140. }

android 简单的画图片的更多相关文章

  1. Android简单逐帧动画Frame的实现(二)

    Android简单逐帧动画Frame的实现   Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...

  2. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  3. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  4. android简单登陆和注册功能实现+SQLite数据库学习

    最近初学android,做了实验室老师给的基本任务,就是简单的登陆和注册,并能通过SQLite实现登陆,SQlLite是嵌入在安卓设备中的 好了下面是主要代码: 数据库的建立: 这里我只是建立了一个用 ...

  5. Android简单的ListViewDemo及每个控件的点击事件

    ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...

  6. Android简单加密保护自有图片资源

    现在大部分android应用的图片资源,被反编译后就可以直接拿来用,如果不想让自己的图片资源直接被反编译后使用,首先想到的应该是把图片加密.这里笔者抛砖引玉,草草写了一个对图片进行简单加密的方法,希望 ...

  7. Android 简单计算器源码....

    PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧...     顺便去对比了一下别人写的代码...有的使用到了 ...

  8. 也发一个自己实现的android简单文件选择器代码。支持多卡,排序

    一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡..并且实现了排序效果. 只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录. 利用Co ...

  9. Android简单计算器

    这是很久之前做的,方法很简单,都是一些基础的,不足的是还有很多功能不够. activity_main.xml布局: <LinearLayout xmlns:android="http: ...

随机推荐

  1. rgb & rgba convert

    rgb & rgba convert RGB color to Hex, Pantone, RAL, HSL, HSV, HSB, JSON. Get color scheme. https: ...

  2. Delphi中统一显示表格字段名的高效方法

    问题描述:在开发数据库程序时,我们经常要使用很多的表格显示组件DBGrid.当DBGrid显示某表格的数据时,其字段标题默认的就是后台数据库中的表格的字段名称.而为了数据库开发方便,后台数据库中的表格 ...

  3. 【Linux】工作管理

    在进行工作管理的行为中,其实每个工作都是目前bash的子进程,即彼此间是有相关性的.我们无法以job control的方式由tty1的环境去管理tty2的bash 当只有一个终端时,可以出现提示符让你 ...

  4. 【转】Thread Local的正确原理与适用场景

    本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 Thre ...

  5. python 模块之-os

    python  os模块 import os os.getcwd()       # python脚本所在工作目录的路径 os.chdir(r'/tmp')        # 切换目录到tmp os. ...

  6. Django-website 程序案例系列-1 最简单的web服务器

    templates:html模板文件夹下面建立文件login.html <!DOCTYPE html> <html lang="en"> <head& ...

  7. 基于Spring Security和 JWT的权限系统设计

    写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领域,成熟的安全框架解决方案一般有 A ...

  8. BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick

    题面 求所有长度为\(n\)的.没有相邻的1的01序列中,若0有\(x\)个.1有\(y\)个,\(x^ay^b\)之和(对\(m\)取模). \(n \le 10^7, m \le 10^8, 0 ...

  9. luogu2149 Elaxia的路线 (dijkstra+拓扑dp)

    先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...

  10. luogu2827 [NOIp2016]蚯蚓 (模拟)

    可以直观地想到用优先队列来做,但数据范围是O(n)的 然后我们发现,因为我们每次挑出来的蚯蚓是单调的,所以把每个切成两段后,那两段也是对应单调的 也就是说,算上最一开始的蚯蚓,我们一共维护三个队列,三 ...