页面布局,相对布局
按钮位于父窗体的下方使用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()方法 发送广播
代码:
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(); } } }