网上的画板代码收集和整理

修改后的代码[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何写年终总结(转)

很多人不重视年终总结,觉得是一个非常令人厌烦的任务,往往是应付了事,短短几百字,对目前工作中存在的问题发现不够,思考不足,对自己一年的评价和未来一年的定位没有说明。造成的后果就是公司得不到来自基层…

cad移动时捕捉不到基点_CAD入门必备(一)移动和复制新手必看

cad也疯狂前言:CAD绘图之所以能够取代手工绘图,很大的一部分原因是因为它可以很方便的修改和重复利用,例如外参可以节省很大部分时间。而我们在使用CAD中,用得最频繁的功能就是移动和复制了,当然这也是新手必备的其中一…

H.264软件解码器在PXA270平台上的优化

罗 嵘,何 苦 时间:2009年04月24日摘 要: 研究了嵌入式系统中H.264 Baseline软件解码器设计和优化的问题,提出了四种有效的优化方法,并在PXA270平台上进行了测试。测试结果显示,综合使用提出的四种方法,H.26…

JavaWeb笔记04-解决GET与POST乱码问题

解决GET与POST乱码问题: 请求的乱码问题 GET:tomcat8版本之前,get请求会乱码 正常文字 --> UTF-8编码 --> 字节数组 --> ISO-8859-1 编码 --> 乱码文字 正常文字 <-- UTF-8编码 <-- 字节数组 <-- ISO-8859-1 编码 <-- 乱码文字解决乱码的两种格式: …

EF架构~codeFirst从初始化到数据库迁移

一些介绍 CodeFirst是EntityFrameworks的一种开发模式&#xff0c;即代码优先&#xff0c;它以业务代码为主&#xff0c;通过代码来生成数据库&#xff0c;并且加上migration的强大数据表比对功能来生成数据库版本&#xff0c;让程序开发人员不用维护数据库的变更&#xff0c;而…

Ubuntu用户Steam控制器不工作的解决办法

Steam 控制器已开始送货到世界各地游戏玩家手中&#xff0c;不过有朋友遇到 Steam 控制器在 Ubuntu 中无法正常工作&#xff0c;本文我们来介绍一下解决办法。该解决办法并非 Ubuntu 官方提出的最佳解决方案&#xff0c;不过还是可以临时解决 Ubuntu 用户 Steam 控制器不工作的…

lisp 车位块自动编号_机械车位做产权登记,真的适合吗?

为了更好地把握停车市场发展动向&#xff0c;给停车行业从业者提供一个发表观点、各抒己见的平台&#xff0c;共同促进停车行业的发展&#xff0c;《城市停车》开设热点版块&#xff0c;每期针对1-2个行业热点&#xff0c;广泛征集业内人士观点和看法。HOT TOPIC本期热点今年两…

JavaWeb笔记05-解决线程安全问题

线程安全问题: Servlet的service方法,每次被请求是,调用. 这个调用很特殊,是在新的子线程中调用的,当service方法执行完毕,子线程死亡了. 可以简单的理解为:service方法每次执行都是一个新的线程. package cn.xdl.demo1;import javax.servlet.ServletException; import jav…

Java并发编程实战 第14章 构建自定义的同步工具

状态依赖性 定义&#xff1a;只有满足特定的状态才能继续执行某些操作&#xff08;这些操作依赖于固定的状态&#xff0c;这些状态需要等待别的线程来满足&#xff09;。 FutureTask&#xff0c;Semaphroe&#xff0c;BlockingQueue等&#xff0c;都是状态依赖性的类。 条件队列…

webserver接口_SpringBoot内置源码解析WebServer初始化过程

WebServer 初始化过程在上一节中 Spring Boot 初始化了 WebServer 对应的工厂类。同时&#xff0c;我们也知道对应 Web容器的WebServer实现类有:TomcatWebServer、JettyWebServer和UndertowWebServer。这节重点讲解这些 WebServer 是如何被初始化&#xff0c;又如何启动的。Web…

提升应用程序弹性:保障工作负载正常运行

通过集群化、复制、快照、微服务和应用程序设计来提高企业工作负载的应用程序弹性和可用性。 应用程序的弹性和可用性是现代企业工作负载的关键属性。应用程序需要在硬件故障发生后&#xff0c;扛过服务故障(例如负载平衡器和域名系统错误)保持工作状态&#xff0c;并且可以忍受…

JDBC笔记01-JDBC,Connection,Statement,ResultSet,PreparedStatement,Properties

学习目标 理解JDBC原理 掌握Connection接口的使用 掌握Statement接口的使用 掌握ResultSet接口的使用 掌握PreparedStatement接口的使用 掌握Properties类与配置文件的使用 JDBC 概念 JDBC (Java DataBase Connectivity) Java数据库连接技术的简称&#xff0c;提供连接各种常…

NVDKC6416平台H.264算法优化

本文转载自&#xff1a;http://blog.csdn.net/embedesign/archive/2009/09/15/4556486.aspx&#xff0c;版权归原作者&#xff0c;编辑&#xff1a;小乙哥 多媒体通信终端设备具有广泛的应用前景&#xff0c;可以应用于视频会议、可视电话、PDA、数字电视等各个领域&#xff0…

拦截器及 Spring MVC 整合

一、实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现拦截器以及 Spring MVC 框架的整合。 1.2 实验知识点 Spring MVC 框架拦截器1.3 实验环境 JDK1.8Eclipse JavaEE二、实验步骤 2.1 拦截器实现 在项目 hrms 的目录 src/main/java 下新建包 com.shiyanlou.interc…

高德地图轨迹回放_高德地图上线了一个新功能….

文、路人甲TM德地图这两天刚上线了一个叫做「家人地图」的功能&#xff0c;所谓家人地图顾名思义&#xff0c;就是你可以通过高德地图组建一个家人圈&#xff0c;在这个圈子里面你可以看到你的家人在什么位置&#xff0c;当你的家人到达什么位置的时候自动发送通知或者警告&…

You have new mail in /var/spool/mail/root消除提示的方法

有时在进入系统的时候经常提示You have new mail in /var/spool/mail/root 你觉得烦人---解决方法&#xff1a; 修改系统配置文件/etc/profile&#xff0c;告诉系统不要去检查邮箱. 具体操作&#xff1a;命令行输入&#xff1a;echo "unset MAILCHECK" >> /etc…

c3p0-config.xml文件简单说明与备忘

<?xml version"1.0" encoding"UTF-8"?> <c3p0-config><named-config name"mysql"><!-- 配置数据库用户名 --><property name"user">root</property><!-- 配置数据库密码 --><property…

python 消息队列 get是从队首还是队尾取东西_从零开始Python对redis作为消息队列的使用...

一、Redis 服务1、安装yum install redis2、 python安装支持模块/opt/python2.7.13/bin/pip install redis3、 和redis的简单直接交互In [1]: import redisIn [2]: rc redis.Redis(host192.168.8.237,port6379,decode_responsesTrue)In [5]: rc.set(imoocc,jeson)Out[5]: True…

‘’和“”

单引号引的数据是char类型的 双引号引的数据是String类型的 单引号只能引一个字符 而双引号可以引0个及以上 字符&#xff08;Character&#xff09;是指人类语言的最小的表义符号&#xff0c;字符是指计算机中使用的字母、数字和符号&#xff0c;包括1、2、3、A、B、C、#、&am…

Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

转载&#xff1a;http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Quartz实例能给予你很好的Job调度能力&#xff0c;但它不能满足典型的企业需求&#xff0c;如可伸缩性、高可靠性满足。假如你需要故障转移的能力并能运行日益增多的 Job&#xff0c;Quartz集群势必成为你…