Android(java)学习笔记181:多媒体之图片画画板案例
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)学习笔记181:多媒体之图片画画板案例的更多相关文章
- Android(java)学习笔记238:多媒体之图片画画板案例
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 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
随机推荐
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)
最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得.后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的 ...
- node mkdirSync 创建多级目录
提供一个实用的一次性同步创建多级目录的方法,收藏一下. function makeDir(dirpath) { if (!fs.existsSync(dirpath)) { var pathtmp; ...
- Linear Regression_最小二乘(LMS)
%% Machine Learining----Linear Regression close all clear %%data load Year = linspace(,,); Price = [ ...
- List集合与Array数组之间的互相转换
1.数组转换成List集合 采用java中集合自带的asList()方法就可以完成转换了 String[] array = new String[] {"zhu", "w ...
- H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
转自:http://www.cnblogs.com/zyl910/archive/2011/12/08/h264_level.html 对于H.264(MPEG-4 AVC)而言,级别(Level)是 ...
- ORACLE知识点整理之一
1. 安装客户端 去官方网站下载 此处略 2. 客户端登陆身份 Oracle有三种身份登录方式:Normal.sysdba.sysoper. normal身份:普通用户身份,默认选项(默认可以不写), ...
- 魔法宝石(邻接表+dfs更新)
魔法宝石 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submissi ...
- bzoj 3261 最大异或和【可持久化trie】
因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...
- AppStore 审核拒绝原因记录
此文仅记录审核app被拒绝的原因 1.未提供充值功能,app中出现vip或者会员图标文字 被拒 解决,隐藏或取消该图标或文字 2.第三方登录,需要跳转到第三方app登录 被拒 解决,审核时隐藏第三方登 ...