前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2014-11-6Android学习------Android画笔实现画曲线--------贝塞尔曲线(二)

2014-11-6Android学习------Android画笔实现画曲线--------贝塞尔曲线(二)

作者头像
wust小吴
发布2022-03-07 14:18:04
4270
发布2022-03-07 14:18:04
举报
文章被收录于专栏:风吹杨柳风吹杨柳

我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的源码 百度搜就知道很多下载的地方 网上源码的名字叫:Android 仿真翻页效果.zip我的博客写的比较乱,如果本篇文章没有看懂,

1.定义相应的变量

private SurfaceHolder sfh; //当前的类是继承SurfaceView的,做回调处理必须要用到的。 private Paint paint; //画笔 private Canvas canvas; //画布 private Thread th; //线程,用这个线程来独立的负责更新视图 private boolean flag = true; //页面什么时候更新的旗帜,也就是你用画笔在界面上去画,这个变量就true private int startX, startY, controlX, controlY, endX, endY; //贝塞尔曲线需要的三个点,起始,控制,结束 private Path path; //曲线的路径,也即是你手指移动生成的一个路径 private Paint paintQ; //画笔

一个典型的SurfaceView设计模型包括一个由Thread所派生的类,它可以接收对当前的SurfaceHolder的引用,并独立地更新它。

要创建一个新的SurfaceView,需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。

SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder对象的引用,其中包含了当前有效的Surface。

2.继承SurfaceView需要先写构造函数

public MySurfaceView(Context context) { super(context); // TODO Auto-generated constructor stub sfh = getHolder(); //系统执行的,也可以用this.getHolder(); sfh.addCallback(this); //回调函数,这个时候需要让类去实现这个Callback的接口,看下面的代码 path = new Path(); //路径变量的初始化 paintQ = new Paint(); //画笔的初始化 paintQ.setAntiAlias(true); //设置抗锯齿 paintQ.setStyle(Style.STROKE); //设置画笔的样式 paintQ.setStrokeWidth(5); //设置画笔粗细度 paintQ.setColor(Color.WHITE); //设置画笔颜色为白色 }

public class MySurfaceView extends SurfaceView implements Callback, Runnable

3.当继承了这个接口之后需要去重载响应的函数,并实现run()函数的处理工作

1) //线程run,刷屏得到贝塞尔曲线 @SuppressWarnings("static-access") @Override public void run() { // TODO Auto-generated method stub while (flag) { long startTime = System.currentTimeMillis(); //记录开始画的时间,手指按下并拖动 myDraw(); //画出贝塞尔曲线 logic(); //通过起始点和终点构造控制点,这个都是贝塞尔曲线需要用的三个点 long endTime = System.currentTimeMillis(); //记录结束画的的时间,手指松开 if ((endTime - startTime < 50)) { //时间差50,单位毫秒 try { Thread.currentThread().sleep(50 - (endTime - startTime)); //休息时间 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

4.继承SurfaceView是需要去实现一些重载函数的

//SurfaceView被销毁的时候,让旗帜变量变为false,

@Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub flag = false; }

//SurfaceVie被创建的时候

@Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub paint = new Paint(); //这个变量是多余的,可以忽略 paint.setAntiAlias(true); //抗锯齿 th = new Thread(this); //让线程来画 flag = true; //告诉线程我在画了 th.start(); //形成开始执行 }

//SurfaceView被改变的时候

@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub //这里不需要这个回调函数,代码不做任何处理,没有这个监听事件的业务需要处理 }

5.接下来就是怎么样去画贝塞尔曲线,Android中提供的是Path.quadTo()这个函数去画的

private void myDraw() { //定义自己的画图函数 // TODO Auto-generated method stub canvas = sfh.lockCanvas(); //锁定画布 canvas.drawColor(Color.BLACK); //画布的颜色 drawQpath(canvas); //在画布上执行贝塞尔曲线的绘制 sfh.unlockCanvasAndPost(canvas); //画完之后取消锁定 }

6.关于5中的函数:drawQpath(canvas)

//绘制贝塞尔曲线 public void drawQpath(Canvas canvas) { path.reset(); //绘制之前需要把画笔清空 path.moveTo(startX, startY); //起始点 path.quadTo(controlX, controlY, endX, endY); //绘制贝塞尔曲线,控制点和结束点,起始这个函数就是得到这条路径 canvas.drawPath(path, paintQ); //在画布上绘制出这条曲线 }

7.上面的所有准备工作作为了,还有个需要处理,就是监听我手指移动的事件

//响应触摸屏事件,通过手指的位置取得两个重要的点,起始点,和终止点 @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN) {//手指按下,肯定就是起始点了 startX = (int) event.getX(); startY = (int) event.getY(); } if (event.getAction() == MotionEvent.ACTION_MOVE) { //手指移动之后得到终点 endX = (int) event.getX(); endY = (int) event.getY(); } return true; }

到此为止,整个代码就处理完了,在activity中new出来这个视图就可以了

@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(new MySurfaceView(this)); }

看下运行效果图:

程序源码下载地址:http://download.csdn.net/detail/u014737138/8133895

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档