Android开发画画板要考虑得几个问题如下:
1 屏幕画板、画笔如何绘制问题
2 用户手指触摸屏幕画板监听事件,以及对应的几种状态处理问题
3 保存图片到SD卡,以及在系统相册打开时自动加载刚才的图片问题
解决方法
1 使用了BitmapFactor和Bitmap的相关的方法来解析一张背景图,并复制一份副本,再在Canvas来绘制画板,画笔。
2 使用系统的OnTouchLister来监听用户的触摸屏幕画板事件,以及相应的状态进行不同的处理
3 系统每次收到SD卡就绪广播时,都会去遍历sd卡的所有文件和文件夹,把遍历到的所有多媒体文件都在MediaStore数据库保存一个索引,这个索引包含多媒体文件的文件 名、 路径、大小。图库每次打开时,并不会去遍历sd卡获取图片,而是通过内容提供者从MediaStore数据库中获取图片的信息,然后读取该图片。系统开机或者点击加载sd卡按钮时,系统会发送sd卡就绪广播,我们也可以手动发送就绪广播来加载我们保存在sd卡中图片。
代码如下
package com.scywxx.paint; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Menu;
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 Bitmap bmCopy;
private Paint paint;
private Canvas canvas;
private int startX,startY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1 加载画画板的背景图
Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
//2 把源位图对象复制一份
bmCopy = Bitmap.createBitmap(bmSrc.getWidth(),bmSrc.getHeight(),bmSrc.getConfig());
//3 创建画笔对象
paint = new Paint();
canvas = new Canvas(bmCopy);
//4 开始绘制
canvas.drawBitmap(bmSrc, new Matrix(), paint);
//5 获取界面上ImageView对象得资源id
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bmCopy);
//6 给画画板得背景设置触摸监听
iv.setOnTouchListener(new OnTouchListener() {
//触摸屏幕时,触摸事件产生时,此方法调用
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();//获取该事件得动作
switch(action){
//用户手指触摸到屏幕
case MotionEvent.ACTION_DOWN:
//记录开始的x和开始的y
startX = (int) event.getX();
startY = (int) event.getY();
break;
//用户手指正在划动
case MotionEvent.ACTION_MOVE:
int x=(int) event.getX();
int y=(int) event.getY();
//两点连成一条线
canvas.drawLine(startX, startY, x, y, paint);
//下次得起始点
startX=x;
startY=y;
iv.setImageBitmap(bmCopy);
break;
//用户手指离开屏幕
case MotionEvent.ACTION_UP:
break; }
//true:告诉系统,这个触摸事件由我来处理
//false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点
return true;
}
}); }
//设置画笔颜色为红色
public void red(View v){
paint.setColor(Color.RED);
}
//设置画笔颜色为红色
public void green(View v){
paint.setColor(Color.GREEN);
}
//设置画笔的粗细
public void change(View v){
paint.setStrokeWidth(7);
}
//保存图片到sd卡中
public void save(View v){
File file = new File("sdcard/huahua.png");
FileOutputStream fos=null;
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//将图片压缩保存
bmCopy.compress(CompressFormat.PNG, 100, fos);
//系统每次收到SD卡就绪广播时,都会去遍历sd卡的所有文件和文件夹,把遍历到的所有多媒体文件都在MediaStore数据库保存一个索引,这个索引包含多媒体文件的文件名、路径、大小
// 图库每次打开时,并不会去遍历sd卡获取图片,而是通过内容提供者从MediaStore数据库中获取图片的信息,然后读取该图片
// 系统开机或者点击加载sd卡按钮时,系统会发送sd卡就绪广播,我们也可以手动发送就绪广播
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
} }
界面布局如下
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".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"
android:layout_alignParentBottom="true"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="红色"
android:onClick="red"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绿色"
android:onClick="green"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="粗细"
android:onClick="change"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save"/>
</LinearLayout> </RelativeLayout>
效果如下