在SurfaceView中自由书写和擦除
/////////继承SurfaceView 的类
public class PaintView extends SurfaceView implements Runnable,SurfaceHolder.Callback {
private float mX;
private float mY;
private Paint mPaint = null;
private Path mPath = null;
// 线程结束标志位
boolean mLoop = true;
SurfaceHolder mSurfaceHolder = null;
Canvas mCanvas; public PaintView(Context context, AttributeSet arr) {
super(context , arr); mSurfaceHolder = this.getHolder();//获取holder
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setFormat(PixelFormat.OPAQUE);//不透明
//mSurfaceHolder.setFormat(PixelFormat.RGB_565);
//mSurfaceHolder.setFormat(PixelFormat.RGBA_8888);
this.setFocusable(true);
// setZOrderOnTop(true);//放到最顶层
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圆头
mPaint.setDither(true);//消除拉动,使画面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub } @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(this).start();//启动线程
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mLoop = false; //结束线程 } @Override
public void run() {
while (mLoop==true) {
Draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} // 画图
private void Draw() {
try{
mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawPath(mPath, mPaint); //// }catch (Exception e){
}finally {
if (mCanvas !=null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
} @Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
touchMove(event);
}
//更新绘制
invalidate();
return true;
} //手指点下屏幕时调用
private void touchDown(MotionEvent event)
{
//隐藏之前的绘制
// mPath.reset(); //
float x = event.getX();
float y = event.getY(); mX = x;
mY = y;
//mPath绘制的绘制起点
mPath.moveTo(x, y);
} //手指在屏幕上滑动时调用
private void touchMove(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY(); final float previousX = mX;
final float previousY = mY; final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY); //两点之间的距离大于等于3时,生成贝塞尔绘制曲线
if (dx >= 3 || dy >= 3)
{
//设置贝塞尔曲线的操作点为起点和终点的一半
float cX = (x + previousX) / 2;
float cY = (y + previousY) / 2; //二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点
mPath.quadTo(previousX, previousY, cX, cY); //第二次运行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
mX = x;
mY = y;
}
}
////橡皮擦
private void setEraser(){
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(50);
// mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圆头
mPaint.setDither(true);//消除拉动,使画面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
mPaint.setAlpha(0); ////
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
}
////////在Activity中显示以上视图
setContentView(new PaintView(this));
在SurfaceView中自由书写和擦除的更多相关文章
- 「ReStory」在 Markdown 中自由书写 React 组件 (Beta)
		
介绍 先睹为快 我们在开发一个小小的 React 组件库,但是我们遇到了一个大难题,那就是为我们的组件库书写一个合理的文档. 作为组件文档,我们非常希望我们的组件用例代码能够展现出来,是的我们在书写文 ...
 - Android 动态背景的实现以及SurfaceView中添加EditText控件
		
首先还是一贯作风,我们先看案例: \ 静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并不复杂,这个如果让做 ...
 - 深入Animation,在SurfaceView中照样使用Android—Tween Animation!
		
第一类:Frame By Frame 帧动画( 不推荐游戏开发中使用) 所谓帧动画,就是顺序播放事先做好的图像,类似于放电影: 分析: 此种方式类似我之 ...
 - Oracl中sql书写技巧
		
1.写脚本(1)为什么不直接设置回滚点?因为服务器上数据库是很多人使用的,所以除了自己操作外,有很多人操作.如果设置回滚点时,回滚后,很多人操作都消失了,因此savepoint不可以.但是可以自己书写 ...
 - Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数
		
话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功 ...
 - MVC5 Razor视图中不规范书写导致的编译问题
		
今天碰到一个非常让人难以理解的问题,如图所示,但是我在代码中并没有找到缺失"}"的地方: 根据源文件提示有去 AppData\Local\Temp\Temporary ASP.NE ...
 - 虚拟现实中自由步行(free-space walking)
		
之前我们讲到了虚拟现实中漫游方式的分类.虚拟现实中的漫游(travel/navigate)方式,即是应用提供给用户的,在虚拟环境中移动的方式.虚拟现实的漫游方式中,有一种被称为“完全动作线索”1,即用 ...
 - android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
		
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
 - android SurfaceView中播放视频 按视频的原始比例播放
		
OnPreparedListener mediaPlayerOnPreparedListener = new OnPreparedListener() { @Override public void ...
 
随机推荐
- [置顶] 利用CXF发布webService的小demo
			
其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架... 先将相关的jar引进来 ...
 - 求pi 的公式
			
pi = 3.1415926..... 下面用c 语言来求解PI 现有公式 (pi*pi)/6 = 1 + 1/(2*2) + 1/(3*3) + ... + 1/(n*n); #include &l ...
 - play framework2.5.
			
play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...
 - AutoFac使用方法总结:Part II
			
事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他的初始化工 ...
 - ubuntu下安装wine
			
直接在终端里面输入“sudo apt-get install wine”不要引号,即可安装wine.至于使用它,终端命令就是“wine ....”举个例子,你现在要运行魔兽, 然后你的魔兽的文件夹的位 ...
 - 重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息
			
原文:重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息 [源码下载] 重新想象 Windows 8 Store ...
 - CSS设计指南之浮动与清除
			
原文:CSS设计指南之浮动与清除 浮动意思就是把元素从常规文档流中拿出来,浮动元素脱离了常规文档流之后,原来紧跟在其后的元素就会在空间允许的情况下,向上提升到与浮动元素平起平坐. 一.浮动 CSS设计 ...
 - PHP第七课 使用方法数组2
			
学习平台: 1.了解数组函数 2.输出随机验证码 1.数组函数: 数组函数: //作用:提供了非常多官方写的非常实用的代码段,提高编写速度. 1.数组的键值操作函数 2.统计数组的元素和唯一性 3.使 ...
 - GitLab 之 Linux十分钟快装(转)
			
先把 Shell 命令贴出来,楼主以 CentOS release 6.5 (Final) 64位 为例: //配置系统防火墙,把HTTP和SSH端口开放. sudo yum install curl ...
 - 允许debian wheezy支持IOS7+的iphone.
			
IOS更新, 连接到数据线,不能使用 我想复制iphone照片只能用于内itunes对? 于linux这里面其实很容易处理. 在这里,我们使用了一个相对较新的组件libimobiledevice 为 ...