页面布局,相对布局
按钮位于父窗体的下方使用android:layout_alignParentBottom=”true”
图片位于按钮的上方,填充父窗体,使用android:layout_above=”@ id/xxxxxid”
获取到ImageView对象
调用Bitmap.createBitmap(width,height,config)方法,创建一个可以被修改的Bitmap对象
参数:width height宽高写死,config是Bitmap.Config.ARGB_8888
获取Canvas对象,通过new Canvas(bitmap)
调用Canvas对象的drawColor()方法,初始化背景颜色,参数:Color.WHITE白色
调用ImageView对象的setOnTouchListener()方法,参数:OnTouchListener对象,这个类是一个接口类型,因此直接new它创建匿名内部类实现方法onTouch()
在onTouch(View v,MotionEvent event)方法里面
参数:View对象是被触摸的对象,MotionEvent对象是触摸事件对象
调用MotionEvent对象的getAction()方法,获取触摸事件
switch判断这个事件
事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕
事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动
事件为MotionEvent.ACTION_UP是手指离开屏幕
当手指触摸屏幕时
定义手指开始位置的坐标startX startY
调用MotionEvent对象的getX() 和 getY()方法,可以得到坐标
当手指移动的时候,我们要获取新的坐标newX和newY,方法和上面一样
调用Canvas对象的drawLine()方法,画一条线,参数:startX,startY,newX,newY,paint
获取Paint画笔对象,通过new出来
调用Paint对象的setTrokeWidth()方法,设置画笔粗细,参数:像素
调用Paint对象的setColor()方法,设置画笔颜色,参数:Color.GREEN
注意要从新更新画笔的位置
调用ImageView对象的setImageBitmap(bitmap)方法,把Bitmap显示到控件里
onTouch()方法一定要返回true,才能被持续执行
点击保存按钮,把图片保存到SD卡上
调用Bitmap对象的compress()方法,参数:图片格式CompressFormat.JPEG,图片质量100,输出流
获取File对象,通过new File(Environment.getExternalStorageDirectory(),文件名),文件名是时间戳
获取FileOutputStream对象
需要权限android.permission.WRITE_EXTERNAL_STORGE
使用系统图库查看图片
此时会看不到,以为图库只有在sd卡挂载的时候,才扫描文件
获取Intent对象,通过new出来
调用Intent对象的setAction()方法,参数:Intent.ACTION_MEDIA_MOUNTED
调用Intent对象的setData()方法,
参数:文件目录对象Uri.fromFile(Environment.getExternalStorageDirectory())
调用sendBroadcast()方法 发送广播
代码:
代码语言:javascript复制package com.tsh.tshpaint;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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.view.InputDevice.MotionRange;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView iv_img;
private Bitmap baseBitmap;
private Canvas canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_img = (ImageView) findViewById(R.id.iv_img);
// 创建空Bitmap
baseBitmap = Bitmap.createBitmap(320, 359, Bitmap.Config.ARGB_8888);
canvas = new Canvas(baseBitmap);
canvas.drawColor(Color.WHITE);
// 设置手指滑动事件
iv_img.setOnTouchListener(new OnTouchListener() {
int startX;
int startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
//画笔
Paint paint=new Paint();
paint.setStrokeWidth(5);
paint.setColor(Color.GREEN);
switch (action) {
// 手指按下
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);
startX=(int) event.getX();
startY=(int) event.getY();
iv_img.setImageBitmap(baseBitmap);
break;
// 手指离开
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});
}
//保存图片
public void save(View v){
File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() ".jpg");
FileOutputStream stream;
try {
stream = new FileOutputStream(file);
baseBitmap.compress(CompressFormat.JPEG, 100, stream);
stream.close();
//发送sd卡挂载通知
Intent intent=new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
Toast.makeText(this, "保存图片成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "保存图片失败", 0).show();
}
}
}