1.首先我们编写布局文件activity_main.xml如下:

    1. <RelativeLayout 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. tools:context="com.himi.painter.MainActivity" >
    6. <ImageView
    7. android:layout_width="match_parent"
    8. android:layout_height="match_parent"
    9. android:id="@+id/iv" />
    10. </RelativeLayout>
2.初步编写MainActivity.java,如下:
    1. package com.himi.painter;
    2. import android.app.Activity;
    3. import android.graphics.Bitmap;
    4. import android.graphics.Canvas;
    5. import android.graphics.Color;
    6. import android.graphics.Paint;
    7. import android.os.Bundle;
    8. import android.view.MotionEvent;
    9. import android.view.View;
    10. import android.view.View.OnTouchListener;
    11. import android.widget.ImageView;
    12. public class MainActivity extends Activity {
    13. private ImageView iv;
    14. private Canvas canvas;
    15. private Paint paint;
    16. private Bitmap bitmap;
    17. @Override
    18. protected void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. setContentView(R.layout.activity_main);
    21. iv = (ImageView) findViewById(R.id.iv);
    22. //创建一个空白的图片,以图片为模板创建一个画板
    23. bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
    24. //创建画板
    25. canvas = new Canvas(bitmap);
    26. //创建画笔
    27. paint = new Paint();
    28. paint.setColor(Color.BLACK);
    29. canvas.drawColor(0x22888888);
    30. iv.setImageBitmap(bitmap);
    31. iv.setOnTouchListener(new OnTouchListener() {
    32. //手在屏幕上的初始化坐标
    33. int startX;
    34. int startY;
    35. public boolean onTouch(View v, MotionEvent event) {
    36. switch (event.getAction()) {
    37. case MotionEvent.ACTION_DOWN://手指按下
    38. startX = (int) event.getX();
    39. startY = (int) event.getY();
    40. break;
    41. case MotionEvent.ACTION_MOVE://手指滑动
    42. int newX = (int) event.getX();
    43. int newY = (int) event.getY();
    44. canvas.drawLine(startX, startY, newX, newY, paint);
    45. //重新更新UI
    46. iv.setImageBitmap(bitmap);
    47. break;
    48. case MotionEvent.ACTION_UP://手指离开屏幕
    49. break;
    50. }
    51. return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
    52. }
    53. });
    54. }
    55. }

    运行效果如下:

 
这个画板程序是有问题的,就是他开始固定了划线的起始点(就是我们刚刚接触屏幕的点),然后就像如图那样好像散射一样。这是不行的。我们要不断地更新我们的划线的起始点;

 
MainActivity修改如下:
    1. package com.himi.painter;
    2. import android.app.Activity;
    3. import android.graphics.Bitmap;
    4. import android.graphics.Canvas;
    5. import android.graphics.Color;
    6. import android.graphics.Paint;
    7. import android.os.Bundle;
    8. import android.view.MotionEvent;
    9. import android.view.View;
    10. import android.view.View.OnTouchListener;
    11. import android.widget.ImageView;
    12. public class MainActivity extends Activity {
    13. private ImageView iv;
    14. private Canvas canvas;
    15. private Paint paint;
    16. private Bitmap bitmap;
    17. @Override
    18. protected void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. setContentView(R.layout.activity_main);
    21. iv = (ImageView) findViewById(R.id.iv);
    22. //创建一个空白的图片,以图片为模板创建一个画板
    23. bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
    24. //创建画板
    25. canvas = new Canvas(bitmap);
    26. //创建画笔
    27. paint = new Paint();
    28. paint.setColor(Color.BLACK);
    29. canvas.drawColor(0x22888888);
    30. iv.setImageBitmap(bitmap);
    31. iv.setOnTouchListener(new OnTouchListener() {
    32. //手在屏幕上的初始化坐标
    33. int startX;
    34. int startY;
    35. public boolean onTouch(View v, MotionEvent event) {
    36. switch (event.getAction()) {
    37. case MotionEvent.ACTION_DOWN://手指按下
    38. startX = (int) event.getX();
    39. startY = (int) event.getY();
    40. break;
    41. case MotionEvent.ACTION_MOVE://手指滑动
    42. int newX = (int) event.getX();
    43. int newY = (int) event.getY();
    44. canvas.drawLine(startX, startY, newX, newY, paint);
    45. //重新更新UI
    46. iv.setImageBitmap(bitmap);
    47. //很重要,重新给开始坐标赋值
    48. startX = (int) event.getX();
    49. startY = (int) event.getY();
    50. break;
    51. case MotionEvent.ACTION_UP://手指离开屏幕
    52. break;
    53. }
    54. return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
    55. }
    56. });
    57. }
    58. }

    这时候画图板就正常了,如下:

 
 
3.画图板只能一种颜色,太单调,我们完善一下:
其中 activity_main.xml:
 
  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.himi.painter.MainActivity" >
  7. <ImageView
  8. android:id="@+id/iv"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content" />
  11. <LinearLayout
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:orientation="horizontal" >
  15. <View
  16. android:id="@+id/red"
  17. android:layout_width="20dip"
  18. android:layout_height="20dip"
  19. android:background="#ff0000"/>
  20. <View
  21. android:id="@+id/green"
  22. android:layout_width="20dip"
  23. android:layout_height="20dip"
  24. android:background="#00ff00"/>
  25. <View
  26. android:id="@+id/blue"
  27. android:layout_width="20dip"
  28. android:layout_height="20dip"
  29. android:background="#0000ff" />
  30. </LinearLayout>
  31. <!-- android:max="20" 进度条范围对应于 这里是针对画笔粗细范围设置为0~20 -->
  32. <SeekBar
  33. android:id="@+id/seekBar1"
  34. android:max="100"
  35. android:layout_width="match_parent"
  36. android:layout_height="wrap_content" />
  37. <Button
  38. android:onClick="save"
  39. android:layout_width="match_parent"
  40. android:layout_height="wrap_content"
  41. android:text="保存图片"/>
  42. </LinearLayout>
其次是MainActivity.java:
 
  1. package com.himi.painter;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.Bitmap.CompressFormat;
  8. import android.graphics.Canvas;
  9. import android.graphics.Color;
  10. import android.graphics.Paint;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.os.Environment;
  14. import android.os.SystemClock;
  15. import android.view.MotionEvent;
  16. import android.view.View;
  17. import android.view.View.OnClickListener;
  18. import android.view.View.OnTouchListener;
  19. import android.widget.ImageView;
  20. import android.widget.SeekBar;
  21. import android.widget.SeekBar.OnSeekBarChangeListener;
  22. import android.widget.Toast;
  23. public class MainActivity extends Activity implements OnClickListener {
  24. private ImageView iv;
  25. private Canvas canvas;
  26. private Paint paint;
  27. private Bitmap bitmap;
  28. private View red,green,blue;
  29. private SeekBar seekBar1;
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.activity_main);
  34. iv = (ImageView) findViewById(R.id.iv);
  35. seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
  36. red = (View) findViewById(R.id.red);
  37. green = (View) findViewById(R.id.green);
  38. blue = (View) findViewById(R.id.blue);
  39. red.setOnClickListener(this);
  40. green.setOnClickListener(this);
  41. blue.setOnClickListener(this);
  42. seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  43. public void onStopTrackingTouch(SeekBar seekBar) {//停止拖动进度条,调用的方法
  44. int size = seekBar.getProgress();
  45. //设置画笔的粗细
  46. paint.setStrokeWidth(size);
  47. }
  48. public void onStartTrackingTouch(SeekBar seekBar) {//刚刚接触进度条,调用的方法
  49. // TODO 自动生成的方法存根
  50. }
  51. public void onProgressChanged(SeekBar seekBar, int progress,
  52. boolean fromUser) {//拖动进度条过程中,调用的方法
  53. // TODO 自动生成的方法存根
  54. }
  55. });
  56. //创建一个空白的图片,以图片为模板创建一个画板
  57. bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
  58. //创建画板
  59. canvas = new Canvas(bitmap);
  60. //创建画笔
  61. paint = new Paint();
  62. paint.setColor(Color.BLACK);
  63. canvas.drawColor(0x22888888);
  64. iv.setImageBitmap(bitmap);
  65. iv.setOnTouchListener(new OnTouchListener() {
  66. //手在屏幕上的初始化坐标
  67. int startX;
  68. int startY;
  69. public boolean onTouch(View v, MotionEvent event) {
  70. switch (event.getAction()) {
  71. case MotionEvent.ACTION_DOWN://手指按下
  72. startX = (int) event.getX();
  73. startY = (int) event.getY();
  74. break;
  75. case MotionEvent.ACTION_MOVE://手指滑动
  76. int newX = (int) event.getX();
  77. int newY = (int) event.getY();
  78. canvas.drawLine(startX, startY, newX, newY, paint);
  79. //重新更新UI
  80. iv.setImageBitmap(bitmap);
  81. //很重要,重新给开始坐标赋值
  82. startX = (int) event.getX();
  83. startY = (int) event.getY();
  84. break;
  85. case MotionEvent.ACTION_UP://手指离开屏幕
  86. break;
  87. }
  88. return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
  89. }
  90. });
  91. }
  92. public void onClick(View v) {
  93. switch (v.getId()) {
  94. case R.id.red:
  95. paint.setColor(Color.RED);
  96. Toast.makeText(this, "设置画笔颜色为红色", 0).show();
  97. break;
  98. case R.id.green:
  99. paint.setColor(Color.GREEN);
  100. Toast.makeText(this, "设置画笔颜色为绿色", 0).show();
  101. break;
  102. case R.id.blue:
  103. paint.setColor(Color.BLUE);
  104. Toast.makeText(this, "设置画笔颜色为蓝色", 0).show();
  105. break;
  106. default:
  107. break;
  108. }
  109. }
  110. //保存图片
  111. public void save(View view) {
  112. try {
  113. File file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+".png");
  114. FileOutputStream stream = new FileOutputStream(file);
  115. //第一个参数是保存的图片类型;第二个参数是画质(100是完美画质),第三个参数是输出流
  116. //保存图片类型为PNG支持透明度
  117. bitmap.compress(CompressFormat.PNG, 100, stream);
  118. stream.close();
  119. Toast.makeText(this, "保存成功,文件路径为:"+file.getAbsolutePath(), 0).show();
  120. //Android手机系统自带"图库",里面只有开机的时候 或者是 插入SD卡时候才会扫描里面的资源,这里我们可以欺骗系统,模拟发送SD插入的广播给系统
  121. Intent intent = new Intent();
  122. intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
  123. intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
  124. sendBroadcast(intent);
  125. } catch (Exception e) {
  126. // TODO 自动生成的 catch 块
  127. e.printStackTrace();
  128. Toast.makeText(this, "保存失败,请检查路径", 0).show();
  129. }
  130. }
  131. }

运行结果如下:

 

保存图片:

SD保存数据如下:

导出图片1244274.png到桌面上,如下:

Android(java)学习笔记181:多媒体之图片画画板案例的更多相关文章

  1. Android(java)学习笔记238:多媒体之图片画画板案例

    1.首先我们编写布局文件activity_main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/a ...

  2. Java学习笔记17(面向对象十:综合案例)

    在面向对象这个专题的最后 结合前面多篇文章,用到了面向对象的很多方面知识,做了一个简单的案例: 饭店案例: package hotel; /* * 酒店的员工类 * 员工共同特点:姓名,工号,工作方法 ...

  3. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  4. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  5. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  6. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  9. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

随机推荐

  1. QT官网开源版下载引导(不用登录QT账号)

    一.进入QT官网下载页,首先映入眼前的就是一幅用户选择的调查引导,如下图 二.上图页面显示的可以忽略,直接在上图下载页面上下拉至底部,选择OpenSource->Get started即可进行下 ...

  2. PostgreSQL 图形化客户端工具有哪些

    linux下有字符界面的:psql         图形界面的:pgaccesswindows系统可以用:phpPgAdmin或者telnet+psql 和phpmyadmin 一家的phpPgAdm ...

  3. margin---bug

    常见的浏览器下margin出现的bug IE6中双边距Bug:发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:ri ...

  4. API介绍

    API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码 ...

  5. 所读STL文章摘要集结

    在网上看了一些STL相关文章,这里将它们的摘要进行集结,方便以后查找. 1.黄常标,林俊义,江开勇.快速成形中STL文件拓扑信息的快速建立.2004 摘要:在分析现有建立拓扑信息方法的基础上,提出基于 ...

  6. robotframework自动化系列:文本类型的下拉框

    对于下拉框定位和输入,这里主要遇到有两种类型的下拉选择. 其中一个类型是select-options格式,如图 这种方式的定位可以使用select from list by value或select ...

  7. mybatis使用要点(2019.5.19)

    接口入参 只有一个参数,叫啥都没问题 有两个参数以上,需使用@Param,否则名字依次为0.1.2和param1.param2.param3 一般用#,防sql注入:偶尔用$,比如需要动态表名等 接口 ...

  8. iOS bounds vs frame

    斯坦福iOS开发课程的白胡子大叔的PPT解释得淋漓尽致!

  9. 通过 xshell 连接 ubuntu on windows(WSL)

    装上 ubuntu on windows 后,默认要先打开 cmd, 再运行 bash 进入 ubuntu 的 shell. 但是这个shell很难看,配色不好就算了,还存在各种复制粘贴麻烦. 默认没 ...

  10. git for mac

    Git 使用 1.下载完成后打开终端,使用git --version或者which git命令查看安装版本,有就是安装成功了. 2.创建一个全球用户名.全球邮箱 git config --global ...