修改后的代码[1]为,少了一个}

package com.example.administrator.myapplication;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;public class MyWallActivity extends Activity
{private SurfaceView mSurfaceView = null;private SurfaceHolder mSurfaceHolder = null;private Button cleanButton = null;private Button colorButton = null;private float oldX = 0f;private float oldY = 0f;private boolean canDraw = false;private Paint mPaint = null;//用来记录当前是哪一种颜色private int whichColor = 0;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview);mSurfaceHolder = mSurfaceView.getHolder();mPaint = new Paint();
//画笔的颜色mPaint.setColor(Color.RED);
//画笔的粗细mPaint.setStrokeWidth(2.0f);cleanButton = (Button) this.findViewById(R.id.flushbutton);
//按钮监听cleanButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
// TODO Auto-generated method stub
//锁定整个SurfaceViewCanvas mCanvas = mSurfaceHolder.lockCanvas();mCanvas.drawColor(Color.BLACK);
//绘制完成,提交修改mSurfaceHolder.unlockCanvasAndPost(mCanvas);
//重新锁一次mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));mSurfaceHolder.unlockCanvasAndPost(mCanvas);}});colorButton = (Button) this.findViewById(R.id.colorbutton);
//按钮监听colorButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog mDialog = new AlertDialog.Builder(MyWallActivity.this).setTitle("corlor setting").setSingleChoiceItems(new String[]{"red", "green", "blue"}, whichColor, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubswitch (which) {case 0: {
//画笔的颜色mPaint.setColor(Color.RED);whichColor = 0;break;}case 1: {
//画笔的颜色mPaint.setColor(Color.GREEN);whichColor = 1;break;}case 2: {
//画笔的颜色106mPaint.setColor(Color.BLUE);whichColor = 2;break;}}}}).setPositiveButton("confirm", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stubdialog.dismiss();}}).create();mDialog.show();}});}@Overridepublic boolean onTouchEvent(MotionEvent event){
//获取x坐标float x = event.getX();
//获取y坐标(不知道为什么要减去一个偏移值才对得准屏幕)float y = event.getY();
//第一次进来先不管if(canDraw){
//获取触屏事件switch(event.getAction()){
//如果是拖动事件case MotionEvent.ACTION_MOVE:{
//锁定整个SurfaceViewCanvas mCanvas = mSurfaceHolder.lockCanvas();mCanvas.drawLine(x, y, oldX, oldY, mPaint);mSurfaceHolder.unlockCanvasAndPost(mCanvas);
//重新锁一次mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));mSurfaceHolder.unlockCanvasAndPost(mCanvas);break;}}}
//保存目前的x坐标值oldX = x;
//保存目前的y坐标值oldY = y;canDraw = true;return true;}}

[2]里面有个demo可以直接使用,应该是eclipse上的,我转换为了as的,不过有锯齿

[3]使用贝塞尔曲线的方法去除了锯齿

在[4]中可以使用橡皮擦,貌似需要更改一些东西,否则会闪退,可能和用的是as相关

package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.app.Activity;
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.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;public class MainActivity extends Activity {private int SCREEN_W;private int SCREEN_H;private int Pen = 1;private int Eraser = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);Button paint = new Button(this);paint.setText("画笔");layout.addView(paint, params);Button eraser = new Button(this);eraser.setText("橡皮");layout.addView(eraser, params);final MyView myView = new MyView(this);layout.addView(myView);setContentView(layout);paint.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {myView.setMode(Pen);}});eraser.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {myView.setMode(Eraser);}});}//MyView就是自定义的画板class MyView extends View {private int mMode = 1;private Bitmap mBitmap;private Canvas mCanvas;private Paint mEraserPaint;private Paint mPaint;private Path mPath;private float mX, mY;private static final float TOUCH_TOLERANCE = 4;public MyView(Context context) {super(context);setFocusable(true);setScreenWH();initPaint();}private void setScreenWH() {DisplayMetrics dm = new DisplayMetrics();dm = this.getResources().getDisplayMetrics();int screenWidth = dm.widthPixels;int screenHeight = dm.heightPixels;SCREEN_W = screenWidth;SCREEN_H = screenHeight;}//设置绘制模式是“画笔”还是“橡皮擦”public void setMode(int mode){this.mMode = mode;}private void initPaint() {//画笔mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStrokeJoin(Paint.Join.ROUND);mPaint.setColor(Color.BLACK);mPaint.setStrokeWidth(10);//橡皮擦mEraserPaint = new Paint();mEraserPaint.setAlpha(0);//这个属性是设置paint为橡皮擦重中之重//这是重点//下面这句代码是橡皮擦设置的重点mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//上面这句代码是橡皮擦设置的重点(重要的事是不是一定要说三遍)mEraserPaint.setAntiAlias(true);mEraserPaint.setDither(true);mEraserPaint.setStyle(Paint.Style.STROKE);mEraserPaint.setStrokeJoin(Paint.Join.ROUND);mEraserPaint.setStrokeWidth(30);mPath = new Path();mBitmap = Bitmap.createBitmap(SCREEN_W, SCREEN_H, Config.ARGB_8888);mCanvas = new Canvas(mBitmap);}@Overrideprotected void onDraw(Canvas canvas) {if (mBitmap != null) {canvas.drawBitmap(mBitmap, 0, 0, mPaint);}super.onDraw(canvas);}private void touch_start(float x, float y) {mPath.reset();mPath.moveTo(x, y);mX = x;mY = y;//如果是“画笔”模式就用mPaint画笔进行绘制if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}//如果是“橡皮擦”模式就用mEraserPaint画笔进行绘制if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}private void touch_move(float x, float y) {float dx = Math.abs(x - mX);float dy = Math.abs(y - mY);if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);mX = x;mY = y;if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}}private void touch_up() {mPath.lineTo(mX, mY);if (mMode == Pen) {mCanvas.drawPath(mPath, mPaint);}if (mMode == Eraser) {mCanvas.drawPath(mPath, mEraserPaint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:touch_start(x, y);invalidate();break;case MotionEvent.ACTION_MOVE:touch_move(x, y);invalidate();break;case MotionEvent.ACTION_UP:touch_up();invalidate();break;}return true;}}
}

[1] 一个简单涂鸦http://www.jizhuomi.com/android/example/19.html

[2] 安卓实现代码的多种方式

[3] 安卓path类的lineTo和quadTo方法的区别

[4] 带画板http://www.mamicode.com/info-detail-1480421.html

转载于:https://www.cnblogs.com/hellokittyblog/p/9128418.html

网上的画板代码收集和整理相关推荐

  1. 工作中的javascript代码收集及整理

    有个pub库放在blog的文件夹里面了,注意查查 1.用javascript去除字符串左右空格,包括全角和半角 //用javascript去除字符串左右空格,包括全角和半角 String.protot ...

  2. Java在c盘fld目录下的文件名_VBS脚本常用代码大全2011整理.docx

    PAGE PAGE # / 38 VBS脚本常用经典代码收集于 2011年7月2日21:13:37整理 在网上查找资料的时候发现好多经典的 vbs 代码,收集起来也为了以后学 习. VBS播放音乐 D ...

  3. NILM非侵入式负荷识别(papers with code、data)带代码的论文整理——(论文及实现代码篇) 全网最全

    说在最前面 研究生三年快毕业了,毕业前整理一下该领域的研究工作.正所谓,我栽树,后人乘凉.研究NILM的时候,个人觉得最快的方法是直接复现别人的论文,或者甚至用别人论文的代码直接跑出来体会整个流程(数 ...

  4. 论文收集和整理(三)

    如何收集和整理论文 基础知识 常见概念 正则式 检索式构造的一般流程 检索算符 搜索引擎 Google/必应/百度 ==检索语法== 图片检索 ==学术检索== Yahoo/dmoz BASE搜索引擎 ...

  5. 常看网页表单数据_数据收集、整理低效繁琐?WPS表单帮你轻松解决

    在21世纪这个高速发展的信息时代,不管我们从事何种职业,身处哪个岗位,几乎都会遇到数据收集及整理这类工作,比如收集用户问题反馈.组织活动报名.投票统计.销售数据统计以及学生/员工资料收集等等. 遇到上 ...

  6. css 输入框 按钮 对齐,CSS让input button元素对齐的代码收集

    收集一些用CSs控制INPUT/BUTTON等网页元素与文字对齐的实用小代码,细心的朋友会发现,如果前面一个INPUT,后边是文字的话,你会发现文字和输入框在垂直方向上不是对齐的,影响页面美观,因此本 ...

  7. VS2010的aspx文件中的html代码的格式化整理的方法

    VS2010的aspx文件中的html代码的格式化整理的方法 在进行asp开发的时候,我们在dreamweare中经常使用html格式化代码这个功能, 让原本杂乱的html代码变成有层次感的html, ...

  8. 图元变形lisp源码_收集和整理的lisp源码 收集整理出来的lisp源代码 - 下载 - 搜珍网...

    压缩包 : d376dc2568cd94474be5e8006a7f032.rar 列表 收集和整理的lisp源码/AALINE--绘制多线.LSP 收集和整理的lisp源码/aat--自动标注圆.椭 ...

  9. 电脑PHP动画制作画板,HTML_html5教程制作简单画板代码分享,HTML5制作简单画板 复制代码代 - phpStudy...

    html5教程制作简单画板代码分享 HTML5制作简单画板 复制代码代码如下: http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min ...

最新文章

  1. 中医点滴 1 --- 冬季外感喉咙痛 寒性荨麻疹
  2. ESLint里的规则教会我,无规矩 不编程
  3. 【前端】layui日期控件点击一闪而过解决方法
  4. recycleview 嵌套高度问题_简单解决RecyclerView嵌套的RecyclerView条目显示不全和宽度不能铺满...
  5. Firefox XUL
  6. 剑指offer之求两个数之和(不能使用四则运算)
  7. html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
  8. 解读 Kotlin/Native 技术预览版
  9. activity直接销毁_Android 关于Activity的销毁和重建
  10. Zabbix 3.0安装
  11. 数据库变为可疑_SQL Server 2008R2 数据库出现“可疑”导致无法访问解决办法
  12. Lodop6.226_Clodop3.075.zip
  13. mysql读写分离优点_mysql读写分离
  14. 【算法集训 | 暑期刷题营】7.19题---回溯与剪枝
  15. 2022男神/女神完整投票系统Ver5.5.21
  16. 面试遇到这么一位满嘴骚话的 HR,真牛皮!
  17. 全国青少年编程等级考试python一级真题2021年3月(含题库答题软件账号)
  18. firefox 配置
  19. C++ 实现太阳系行星系统(OpenGL)
  20. 学习vue笔记(5)

热门文章

  1. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)
  2. *【CodeForces - 1088 ABC】套题比赛,A水题B模拟C构造D交互
  3. 【CodeVS - 3639】(树的重心模板,裸题)
  4. 使用OpenCV库快速求解相机内参
  5. layui 流加载flow遇到的问题
  6. HTML上下左右垂直居中
  7. Oracle10g数据库的完全卸载:
  8. leetcode509. 斐波那契数(矩阵快速幂)
  9. lua面向对象编程之点号与冒号的差异详细比较
  10. 什么是TTL电平、CMOS电平、RS232电平