简易涂鸦板

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以上版本要加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值