fragment_main.xml
<FrameLayout 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"
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="com.xwy.tuyaban.MainActivity$PlaceholderFragment" >
<com.xwy.tuyaban.DrawView
android:id="@+id/drawView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
toolsmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:showAsAction="ifRoom|withText"
android:title="@string/color">
<menu>
<!-- 定义一组单选菜单项 -->
<group android:checkableBehavior="single" >
<!-- 定义子菜单 -->
<item
android:id="@+id/red"
android:showAsAction="ifRoom|withText"
android:title="@string/color_red"/>
<item
android:id="@+id/green"
android:showAsAction="ifRoom|withText"
android:title="@string/color_green"/>
<item
android:id="@+id/blue"
android:showAsAction="ifRoom|withText"
android:title="@string/color_blue"/>
</group>
</menu>
</item>
<item
android:showAsAction="ifRoom|withText"
android:title="@string/width">
<menu>
<!-- 定义子菜单 -->
<group>
<item
android:id="@+id/width_1"
android:showAsAction="ifRoom|withText"
android:title="@string/width_1"/>
<item
android:id="@+id/width_2"
android:showAsAction="ifRoom|withText"
android:title="@string/width_2"/>
<item
android:id="@+id/width_3"
android:showAsAction="ifRoom|withText"
android:title="@string/width_3"/>
</group>
</menu>
</item>
<item
android:id="@+id/clear"
android:showAsAction="ifRoom|withText"
android:title="@string/clear"/>
<item
android:id="@+id/save"
android:showAsAction="ifRoom|withText"
android:title="@string/save"/>
</menu>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">简易涂鸦板</string>
<string name="action_settings">Settings</string>
<string name="width_1">1像素</string>
<string name="width_2">5像素</string>
<string name="width_3">10像素</string>
<string name="color_red">红色</string>
<string name="color_green">绿色</string>
<string name="color_blue">蓝色</string>
<string name="color">画笔颜色</string>
<string name="width">画笔宽度</string>
<string name="clear">擦除绘画</string>
<string name="save">保存绘画</string>
</resources>
DrawView.java
package com.xwy.tuyaban;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class DrawView extends View {
private int view_width = 0;//屏幕的宽度
private int view_height = 0;//高度
private float preX;//起始位置的x坐标
private float preY;//起始位置的y坐标
private Path path;//路径
public Paint paint = null;//画笔
Bitmap cacheBitmap = null;//定义一个内存中的图片,该图片将作为缓冲区
Canvas cacheCanvas = null;// 定义cacheBitmap上的Canvas对象
public DrawView(Context context, AttributeSet set) {
super(context, set);
view_width = context.getResources().getDisplayMetrics().widthPixels;//获取屏幕的宽度
view_height = context.getResources().getDisplayMetrics().heightPixels;//获取屏幕的高度
System.out.println(view_width+"*"+view_height);
//创建一个与该View相同大小的缓冲区
cacheBitmap = Bitmap.createBitmap(view_width,view_height,Config.ARGB_8888);
cacheCanvas = new Canvas();
path = new Path();
cacheCanvas.setBitmap(cacheBitmap);// 在cacheCanvas上绘制cacheBitmap
paint = new Paint(Paint.DITHER_FLAG);
paint.setColor(Color.RED);// 设置默认的画笔颜色
//设置画笔的风格
paint.setStyle(Paint.Style.STROKE); //设置填充方式为描边
paint.setStrokeJoin(Paint.Join.ROUND);//设置笔刷的图形样式
paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔转弯处的连接风格
paint.setStrokeWidth(1);// 设置默认笔触的宽度为1像素
paint.setAntiAlias(true);// 使用抗锯齿功能
paint.setDither(true);// 使用抖动效果
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFFFFFFF);//设置背景颜色
Paint bmpPaint = new Paint();//采用默认设置创建一个画笔
canvas.drawBitmap(cacheBitmap, 0, 0,bmpPaint);//绘制cacheBitmap
canvas.drawPath(path, paint);//绘制路径
canvas.save(Canvas.ALL_SAVE_FLAG);////保存canvas的状态
canvas.restore();//恢复canvas之前保存的状态,防止保存后对canvas执行的操作对后续的绘制有影响
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取触摸事件的发生位置
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(x, y);// 将绘图的起始点移到(x,y)坐标点的位置
preX = x;
preY = y;
break;
case MotionEvent.ACTION_MOVE:
float dx = Math.abs(x - preX);
float dy = Math.abs(y - preY);
if(dx>=5 || dy>=5){// 判断是否在允许的范围内
path.quadTo(preX, preY, (x+preX)/2, (y+preY)/2);
preX = x;
preY = y;
}
break;
case MotionEvent.ACTION_UP:
cacheCanvas.drawPath(path, paint); //绘制路径
path.reset();
break;
}
invalidate();
return true;// 返回true表明处理方法已经处理该事件
}
public void clear(){
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setStrokeWidth(50);//设置笔触的宽度
}
public void save(){
try {
saveBitmap("myPicture");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 保存绘制好的位图
public void saveBitmap(String fileName) throws IOException {
File file = new File("/sdcard/pictures/" + fileName + ".png");
file.createNewFile();//创建一个新文件
FileOutputStream fileOS = new FileOutputStream(file);//创建一个文件输出流对象
cacheBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOS);//将绘图内容压缩为PNG格式输出到输出流对象中
fileOS.flush(); //将缓冲区中的数据全部写出到输出流中
fileOS.close(); //关闭文件输出流对象
}
}
MainActivity.java
package com.xwy.tuyaban;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
}
public void openOptionsMenu() {
// TODO Auto-generated method stub
super.openOptionsMenu();
}
// 创建选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflator = new MenuInflater(this);//实例化一个MenuInflater对象
inflator.inflate(R.menu.toolsmenu, menu); //解析菜单文件
return true;
}
// 当菜单项被选择时,作出相应的处理
@Override
public boolean onOptionsItemSelected(MenuItem item) {
DrawView dv = (DrawView) findViewById(R.id.drawView1); //获取自定义的绘图视图
dv.paint.setXfermode(null); //取消擦除效果
dv.paint.setStrokeWidth(1); //初始化画笔的宽度
switch (item.getItemId()) {
case R.id.red:
dv.paint.setColor(Color.RED); //设置画笔的颜色为红色
item.setChecked(true);
break;
case R.id.green:
dv.paint.setColor(Color.GREEN); //设置画笔的颜色为绿色
item.setChecked(true);
break;
case R.id.blue:
dv.paint.setColor(Color.BLUE); //设置画笔的颜色为蓝色
item.setChecked(true);
break;
case R.id.width_1:
dv.paint.setStrokeWidth(1); //设置笔触的宽度为1像素
break;
case R.id.width_2:
dv.paint.setStrokeWidth(5); //设置笔触的宽度为5像素
break;
case R.id.width_3:
dv.paint.setStrokeWidth(10);//设置笔触的宽度为10像素
break;
case R.id.clear:
dv.clear(); //擦除绘画
break;
case R.id.save:
dv.save(); //保存绘画
break;
}
return true;
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
}
在toolsmenu.xml中记得加上android:showAsAction="ifRoom|withText",4.0以上版本要加