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

  1.  <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>
2.初步编写MainActivity.java,如下:
  1.  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---表示没有出来完监听事件
    }
    });
    }
    }

    运行效果如下:

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

 
MainActivity修改如下:
  1.  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---表示没有出来完监听事件
    }
    });
    }
    }

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

 
 
3.画图板只能一种颜色,太单调,我们完善一下:
其中 activity_main.xml:
 
 <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>
其次是MainActivity.java:
 
 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:多媒体之图片画画板案例的更多相关文章

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

    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. Java学习笔记:语言基础

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

  9. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

随机推荐

  1. ubuntu 安装 open in teminal

    sudo apt-get install nautilus-open-terminalnautilus -q

  2. WinPcap编程(一)

    0. 按着文档顺序写的. 开发环境:win10+VS2013. 配置WinPcap环境就不多说.直接给网址:http://blog.sina.com.cn/s/blog_57432f380101qh3 ...

  3. UVa1605 - Building for UN(构造法)

    UVA - 1605 Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description ...

  4. vm拷贝cloudera-scm-agent造成问题

    ------------网络问题---------- ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting  ...

  5. bzoj3141: [Hnoi2013]旅行

    Description   Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...

  6. 解决win8与VC++6.0不兼容问题

    找到VC++6.0安装文件夹Bin下的MSDEV.EXE程序 将MSDEV名字改为MSDEV1(或MSDEV2,3...) 右击改好的MSDEV1,打开属性面板,选择兼容性,勾上“在兼容模式下运行”, ...

  7. C语言位运算

    C语言位运算详解    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...

  8. java和javascript获取word文档的书签位置对比

    1.javascript:把IE浏览器的activex都打开,使用如下网页,可以看到书签顺序和位置: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  9. animate基础

    用JQUERY做动画是很方便的,已经看过大牛们做出不逊色于FLASH的各种效果. 其中的基本功就有animate这个方法的使用.于是,从零开始,训练基本功: <body> <div ...

  10. Tomcat error: A child container failed during start

    Tomcat error: A child container failed during start java.lang.NoClassDefFoundError: org/quartz/Sched ...