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)学习笔记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. Ubuntu:Could not get lock /var/lib/dpkg/lock

    在ubuntu上使用apt-get时,碰过如下问题: 看意思是上一次使用apt-get时异常退出了,锁住了,google了下解决方案如下: 1.先判断是否有apt-get进程在跑,同一时刻只能有一个a ...

  2. [ZJOI 2008] 骑士

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1040 [算法] 首先 , 题目中互相讨厌的关系构成了一棵基环森林 用拓扑排序找出环 ...

  3. 字符串转Unicode码

    var str = '中'; var charCode = str.charCodeAt(0); console.log(charCode); // => 20013; str.charCode ...

  4. HDU 5883 The Best Path (欧拉路或者欧拉回路)

    题意: n 个点 m 条无向边的图,找一个欧拉通路/回路使得这个路径所有结点的异或值最大. 析:由欧拉路性质,奇度点数量为0或2.一个节点被进一次出一次,度减2,产生一次贡献,因此节点 i 的贡献为 ...

  5. E20180503-hm

    in terms of 根据; 用…的话; 就…而言; 以…为单位; in term of   就……而言 argument n. 论据; 争论,争吵; [数] 幅角; 主题,情节; indicate ...

  6. AtCoder Regular Contest 061 DSnuke's Coloring

    http://arc061.contest.atcoder.jp/tasks/arc061_b 题意: H行W列的矩阵中,然后挖了n个洞,输出j(0-9)行,对于第i行输出,有多少个3*3区域中有i个 ...

  7. bzoj 4310: 跳蚤【后缀数组+st表+二分+贪心】

    先求一下SA 本质不同的子串个数是\( \sum n-sa[i]+1-he[i] \),按字典序二分子串,判断的时候贪心,也就是从后往前扫字符串,如果当前子串串字典序大于二分的mid子串就切一下,然后 ...

  8. the little schemer 笔记(2)

    第二章 Do it, Do it Again, and Again, and Again... 假设l是 (Jack Sprat could eat no chicken fat) 那么 (lat? ...

  9. Calculation 2 HDU - 3501

    https://vjudge.net/problem/HDU-3501 不会做啊...记一下做法 做法是计算小于n且与n互质的数的和:根据如果gcd(i,n)==1,那么gcd(n-i,n)==1,对 ...

  10. 学习JavaScript数据结构与算法 (一)

    学习JavaScript数据结构与算法 的笔记, 包含一二三章 01基础 循环 斐波那契数列 var fibonaci = [1,1] for (var i = 2; i< 20;i++) { ...