您的位置:首页 > 移动开发 > Android开发

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

2014-11-07 20:27 399 查看
写一篇文章很辛苦啊!!!

转载请注明,联系请邮件nlp30508@qq.com



我学习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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐