Android(java)学习笔记238:多媒体之图片画画板案例
1.首先我们编写布局文件activity_main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.himi.painter.MainActivity" >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/iv" />
</RelativeLayout>
package com.himi.painter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
//创建一个空白的图片,以图片为模板创建一个画板
bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
//创建画板
canvas = new Canvas(bitmap);
//创建画笔
paint = new Paint();
paint.setColor(Color.BLACK); canvas.drawColor(0x22888888);
iv.setImageBitmap(bitmap);
iv.setOnTouchListener(new OnTouchListener() {
//手在屏幕上的初始化坐标
int startX;
int startY;
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE://手指滑动
int newX = (int) event.getX();
int newY = (int) event.getY();
canvas.drawLine(startX, startY, newX, newY, paint);
//重新更新UI
iv.setImageBitmap(bitmap);
break;
case MotionEvent.ACTION_UP://手指离开屏幕
break;
} return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
}
});
}
}运行效果如下:

package com.himi.painter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
//创建一个空白的图片,以图片为模板创建一个画板
bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
//创建画板
canvas = new Canvas(bitmap);
//创建画笔
paint = new Paint();
paint.setColor(Color.BLACK); canvas.drawColor(0x22888888);
iv.setImageBitmap(bitmap);
iv.setOnTouchListener(new OnTouchListener() {
//手在屏幕上的初始化坐标
int startX;
int startY;
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE://手指滑动
int newX = (int) event.getX();
int newY = (int) event.getY();
canvas.drawLine(startX, startY, newX, newY, paint);
//重新更新UI
iv.setImageBitmap(bitmap);
//很重要,重新给开始坐标赋值
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_UP://手指离开屏幕
break;
} return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
}
});
}
}这时候画图板就正常了,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.himi.painter.MainActivity" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<View
android:id="@+id/red"
android:layout_width="20dip"
android:layout_height="20dip"
android:background="#ff0000"/>
<View
android:id="@+id/green"
android:layout_width="20dip"
android:layout_height="20dip"
android:background="#00ff00"/>
<View
android:id="@+id/blue"
android:layout_width="20dip"
android:layout_height="20dip"
android:background="#0000ff" /> </LinearLayout>
<!-- android:max="20" 进度条范围对应于 这里是针对画笔粗细范围设置为0~20 -->
<SeekBar
android:id="@+id/seekBar1"
android:max="100"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:onClick="save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存图片"/> </LinearLayout>
package com.himi.painter;
import java.io.File;
import java.io.FileOutputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private ImageView iv;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
private View red,green,blue;
private SeekBar seekBar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
red = (View) findViewById(R.id.red);
green = (View) findViewById(R.id.green);
blue = (View) findViewById(R.id.blue); red.setOnClickListener(this);
green.setOnClickListener(this);
blue.setOnClickListener(this); seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) {//停止拖动进度条,调用的方法
int size = seekBar.getProgress();
//设置画笔的粗细
paint.setStrokeWidth(size);
} public void onStartTrackingTouch(SeekBar seekBar) {//刚刚接触进度条,调用的方法
// TODO 自动生成的方法存根 } public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {//拖动进度条过程中,调用的方法
// TODO 自动生成的方法存根 }
}); //创建一个空白的图片,以图片为模板创建一个画板
bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
//创建画板
canvas = new Canvas(bitmap);
//创建画笔
paint = new Paint();
paint.setColor(Color.BLACK); canvas.drawColor(0x22888888);
iv.setImageBitmap(bitmap);
iv.setOnTouchListener(new OnTouchListener() {
//手在屏幕上的初始化坐标
int startX;
int startY;
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE://手指滑动
int newX = (int) event.getX();
int newY = (int) event.getY();
canvas.drawLine(startX, startY, newX, newY, paint);
//重新更新UI
iv.setImageBitmap(bitmap);
//很重要,重新给开始坐标赋值
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_UP://手指离开屏幕
break;
} return true ;//true ---表示监听事件处理完了, false---表示没有出来完监听事件
}
});
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.red:
paint.setColor(Color.RED);
Toast.makeText(this, "设置画笔颜色为红色", 0).show();
break;
case R.id.green:
paint.setColor(Color.GREEN);
Toast.makeText(this, "设置画笔颜色为绿色", 0).show();
break;
case R.id.blue:
paint.setColor(Color.BLUE);
Toast.makeText(this, "设置画笔颜色为蓝色", 0).show();
break;
default:
break;
}
} //保存图片
public void save(View view) {
try {
File file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+".png");
FileOutputStream stream = new FileOutputStream(file);
//第一个参数是保存的图片类型;第二个参数是画质(100是完美画质),第三个参数是输出流
//保存图片类型为PNG支持透明度
bitmap.compress(CompressFormat.PNG, 100, stream);
stream.close();
Toast.makeText(this, "保存成功,文件路径为:"+file.getAbsolutePath(), 0).show(); //Android手机系统自带"图库",里面只有开机的时候 或者是 插入SD卡时候才会扫描里面的资源,这里我们可以欺骗系统,模拟发送SD插入的广播给系统
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
Toast.makeText(this, "保存失败,请检查路径", 0).show();
}
}
}
运行结果如下:

保存图片:

SD保存数据如下:

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

Android(java)学习笔记238:多媒体之图片画画板案例的更多相关文章
- Android(java)学习笔记181:多媒体之图片画画板案例
1.首先我们编写布局文件activity_main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/a ...
- Java学习笔记17(面向对象十:综合案例)
在面向对象这个专题的最后 结合前面多篇文章,用到了面向对象的很多方面知识,做了一个简单的案例: 饭店案例: package hotel; /* * 酒店的员工类 * 员工共同特点:姓名,工号,工作方法 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
随机推荐
- PHP常用代码段:
1.PHP加密解密 function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted ...
- Javascript跳转手机站代码
$(document).ready(function(){ var mobileAgent = new Array("iphone", "ipod", &quo ...
- WAMP集成环境更改web根目录
使用WAMP集成环境,如何更改web根目录 做php开发使用WAMP集成环境的同学大部分有过这样的经历:如果你试图修改web根目录,那么你肯定会想到要修改apache/apache2.2.11/con ...
- BZOJ 1563 诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过\(10^{18}\),则第一行一个数表示不协调度若最小的不协调度超过\(10^{18}\),则输出"\ ...
- Parallax
常听说牛人都是jquery插件用得很好的人. 现在有了github,英文过关的话什么好东西下不到啊,再不用去浏览那些抄来抄去骗人看广告的垃圾网站了. 扯远点,本人有严重的熊猫眼,所以用一种叫倦眼充电棒 ...
- SHELL要发送HTML这类邮件的话,还得靠msmtp 和 mutt
参考蛮多的.. http://storysky.blog.51cto.com/628458/293005 http://www.wilf.cn/post/centos-mutt-msmtp-setup ...
- 几个Uboot命令
1 nand scrub 这个命令会擦除坏块信息,将坏块标识成好的,但此时这个坏块有潜在有危险,在特定条件下仍会造成数据的丢失,所以应该谨慎使用. Run U-boot and then use th ...
- thinkphp中的session()方法
系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 session($name, $value='') 参数 name(必须):如果传入数组 则表示 ...
- Sumdiv(各种数学)
http://poj.org/problem?id=1845 题意:求A^B的所有约数的和再对9901取模: 做了这个学到了N多数学知识: 一:任意一个整数都可以唯一分解成素因子的乘积:A = p1^ ...
- HDU 5396 Expression(DP+组合数)(详解)
题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种 (1+1)*2 或者 ...