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

写一篇文章很辛苦啊!!!

转载请注明,联系请邮件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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值