在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 ...
随机推荐
- 网站可以免费做业务CMS讨论
中国现在用PHPCMS DEDECMS织梦 科学新闻CMS 帝国.Discuz.Ecshop等待,但他们个人利益免费,业务.政府.授权费. 什么CMS它可以自由地做商务网站? 考虑到下面几 ...
- Gitblit配置
Gitblit的安装配置及访问-windows (2013-09-11 11:52:31) 转载▼ 分类: android基础 Git 是现在很流行的分布式版本控制工具,github更是人人皆知. ...
- ios01
http://code4app.com/ 0.全部Swift http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/ ...
- 使用Ratpack和Spring Boot打造高性能的JVM微服务应用
使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...
- POJ1274 The Perfect Stall【二部图最大匹配】
主题链接: id=1274">http://poj.org/problem? id=1274 题目大意: 有N头奶牛(编号1~N)和M个牛棚(编号1~M). 每头牛仅仅可产一次奶.每一 ...
- Linux下一个php+mysql+nginx构建编译(三)
在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...
- Flex发行2048游戏
近来的2048像挺火的游戏.在公交车,吃.甚至还有人走在路上拿着手机在玩.之前我看我的同事们戏,我认为这是很天真,中移动太无聊了吧 到后面,他是在,我觉得真的很无聊,这时候,无聊的时候无聊,后来我想用 ...
- android-将系统和应用程序级的屏幕亮度
/** * 获取当前屏幕亮度模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自己主动调节屏幕亮度 * SCREEN_BRIGHTNESS_MODE_MANUAL=0 ...
- MATLAB描绘极坐标图像——polar
polar可用于描绘极坐标图像. 最简单而经常使用的命令格式:POLAR(THETA, RHO) 当中,THETA是用弧度制表示的角度,RHO是相应的半径. 例: a=-2*pi:.001:2*pi ...
- spring 配置属性的详细信息
摘要(这篇文章讲的红,蓝说这话节) 字面值 字面值:可用字符串表示的值,能够通过<value>元素标签或value属性进行注入 基本数据类型及其封装类.String等类型都能够採取字面值注 ...