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

2022-03-07 14:18:04 浏览数 (1)

我学习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

0 人点赞