Android中Path类的lineTo方法及quadTo方法画线的界别

转载:http://blog.csdn.net/stevenhu\_223/article/details/9229337

  当我们要在屏幕上形成画线时,Path类的采取是必不可少的,而Path类的lineTo和quadTo方法实现之绘图线路形式呢是无一样的,下面就因代码的落实来直观的探讨这简单只点子的成效实现区别;

亡国斧疑邻

   1. Path—>quadTo(float x1, float y1, float x2, float y2):

吕式春秋里描写了个亡斧疑邻的寓言故事:人起亡斧者,意其邻之子。视其行步,窃斧也;颜色,窃斧也;言语,窃斧也;动作神态,无为要无偷斧也。 俄要开挖其谷而得那个斧,他日复见那近邻之子,动作神态无似窃斧者。

    
该方式的兑现是当我们不光是打一久线还是画画弧线时见面形成平滑的曲线,该曲线而称作”贝塞尔曲线”(Bezier
curve),其中,x1,y1为控制点的坐标值,x2,y2也终极的坐标值;

翻译成白话文是这么的:

   
贝塞尔曲线的多变,就按照我们将同长长的橡皮筋拉直,橡皮筋的头尾部对应起点和终极,然后打拉直的橡皮筋中选择随机一点(除头尾对应的点外)扯动橡皮筋形成的弯曲形状,而老扯动橡皮筋的触及就是是控制点;

早年发个体,丢了一如既往将斧。他猜忌是邻里家的儿子偷去矣,便悄悄观察那人。

    下便给为一个Demo来做理解quadTo函数的行使,代码如下:

遂就意识:那人行动的法,像是偷斧子的;那人的气色表情蹩脚鬼祟祟,也如是偷斧子的;那人提吞吞吐吐,更像是偷斧子的,那人的一言一行,一举一动,无一致请勿像偷斧子的。

       1).自定义View:

不久后,丢斧子的人以顶峰挖土的时发现了他的斧头。第二龙又望邻居家的子,就看他言行举止没有一样处像是偷斧子的人数了。

package com.feixun.hu.pt;

import android.content.Context;
import android.gesture.GestureStroke;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class DrawingWithBezier extends View
{
    private float mX;
    private float mY;

    private final Paint mGesturePaint = new Paint();
    private final Path mPath = new Path();

    public DrawingWithBezier(Context context)
    {
        super(context);
        mGesturePaint.setAntiAlias(true);
        mGesturePaint.setStyle(Style.STROKE);
        mGesturePaint.setStrokeWidth(5);
        mGesturePaint.setColor(Color.WHITE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        // TODO Auto-generated method stub
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                 break;
            case MotionEvent.ACTION_MOVE:
                touchMove(event);
        }
        //更新绘制
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        //通过画布绘制多点形成的图形
        canvas.drawPath(mPath, mGesturePaint);
    }

    //手指点下屏幕时调用
    private void touchDown(MotionEvent event)
    {

        //mPath.rewind();
        //重置绘制路线,即隐藏之前绘制的轨迹
        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;
        }
    }

}

当丢斧人初步难以置信邻居家之小子后,就不过专注到对方可能偶尔象是偷斧人的言行举止,而针对其同平常一样的作为无动于衷。

   2).MainActivity:

自及过的一个当

package com.feixun.hu.pt;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //setContentView(new MySurfaceView(this));
        setContentView(new DrawingWithBezier(this));
        //setContentView(new DrawingWithoutBezier(this));      
    }
}

自家于几年前则发了单“信邻而亡币”的错。

  该Demo实现用户在手机屏幕上滑动动手指时,可依据手指滑动的位置绘制有相应的线,类似输入法手势的绘图,所以代码中的画笔Paint命名为mGesturePaint;

大体2009年之时节,我与一个恋人开电商工作。我们做的是手机生意,主要是在EBAY
加拿大立达到售卖。做电商,有稳定低价优质的正品货源是极度要之一个环,因为EBAY不可能卖假货,而且是买家利益至上的一个样式。

 2. Path—>lineTo(float x, float y) :

咱俩当网直达随处寻找货源。功夫不负有心人,我们在CRAIGSLIST(北美之58跟城)上找到一个出苹果手机货源的英国人口拉里。一番邮件往来后我们和他于SKYPE上关系。在几乎龙的闲谈下,我们都拿他当恋人,并决定先试购两华。我们通过PAYPAL(贝宝,相当给支付宝)付款,货款好象是700美元。如果一切顺利,我们充分轻就可知净赚到200美元。

   
 该法实现的单独是鲜接触并成一丝之绘图线路,这样,当我们所以之办法绘制曲线时,缺陷就出了;下面的例子,同样还是与方的Demo差不多,只不过Path调用的是lineTo方法,如下:

拉里答应货到马上发货。

       1). 自定义View:

咱们当了平等礼拜,什么呢远非接受。我们急了,就为外如卷入跟踪号。拉里很舒适,马上发来平等差号码。

package com.feixun.hu.pt;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class DrawingWithoutBezier extends View
{
    private float mX;
    private float mY;

    private final Paint mGesturePaint = new Paint();
    private final Path mPath = new Path();

    public DrawingWithoutBezier(Context context)
    {
        super(context);
        mGesturePaint.setAntiAlias(true);
        mGesturePaint.setStyle(Style.STROKE);
        mGesturePaint.setStrokeWidth(5);
        mGesturePaint.setColor(Color.WHITE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        // TODO Auto-generated method stub
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                 break;
            case MotionEvent.ACTION_MOVE:
                touchMove(event);
        }
        //更新绘制
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        canvas.drawPath(mPath, mGesturePaint);
    }

    //手指点下屏幕时调用
    private void touchDown(MotionEvent event)
    {

        //mPath.rewind();
        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)
        {
            //两点连成直线
            mPath.lineTo(x, y);

            //第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
            mX = x;
            mY = y;
        }
    }

}

俺们查阅了一下,是出这包,还当运受到。心呢放下了。

   2).MainActivity:

而且当了一个星期,还是没到。再翻包裹,已届加拿大国内。我们初步有点担忧。不过要还是顾虑加拿大海关会见翻半龙,并且只要了关税。

package com.feixun.hu.pt;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //setContentView(new MySurfaceView(this));
        //setContentView(new DrawingWithBezier(this));
        setContentView(new DrawingWithoutBezier(this));      
    }
}

再就是过了几龙,终于收到了。并且证实了俺们针对加拿大海关之担忧是剩下的。

  用该例子绘制S形图案,形成的图如下:

咱们收起的仅仅是一致封信:

  图片 1

“APPLE IPHONE: 2”(苹果手机:两大)

    结论
:对比前面quadTo方法绘制的S,lineTo绘制的S在弯弯曲曲部分特别明显的非可知形成平滑的曲,会冒出明显的点滴触及形成细小之突痕。可能图片看的未是明亮,自行运作是Demo,然后在屏幕上制图弯曲曲线或者健全,对比查看他们之象区别就一目了然;

我去……

   3. SurfaceView绘制贝塞尔曲线:

新兴再度找拉里, 我们所轻信的拉里先生就烟消云散得不留一点踪影。

     
 上面的绘图图案方式还是基于View来绘制,当然,我们为得组成SurfaceView和Rect来促成绘制贝塞尔曲线,这样绘制的功效相对会于好,而且效率呢相对比高,毕竟相对SurfaceView而言,在动态绘制点线方面可比View更加出色;

其后回忆,在贸易前,我们受好打了个烧饼。两高手机获利200美元。如果同年卖一千台,就是20万美元。再过几年,就只是开始很店了啊。鸡生蛋,蛋成鸡群,鸡群变羊群,最后成为飞机群,是咱们的盘算。这种思维叫美好愿望思维(Wishful
Thinking), 因太沉浸在不切实际的美好愿望中而忽略了给诈骗的风险,是一模一样种植于注意力错觉的体味偏差。

       如下代码:

坐每分每秒,大脑都使收多音讯,为了增强决策同判效率,大脑有有甩卖新闻的条条框框,这些规则称为考虑捷径。有些思想捷径会使人做出不合逻辑的判断和决定,这些思考捷径称为认知偏差

      1).自定义SurfaceView:

面前亡斧疑邻中之丢斧人所作的摩吗是因平栽认知偏差造成的,叫做确认偏差。

package com.feixun.hu.pt;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView 
{
    private Context mContex;
    private float mX;
    private float mY;

    private SurfaceHolder sfh;
    private Canvas canvas;
    private float mCurveEndX;
    private float mCurveEndY;

    private final Paint mGesturePaint = new Paint();
    private final Path mPath = new Path();
    private final Rect mInvalidRect = new Rect();

    private boolean isDrawing;

    public MySurfaceView(Context context)
    {
        super(context);
        mContex = context;
        sfh = this.getHolder();
        mGesturePaint.setAntiAlias(true);
        mGesturePaint.setStyle(Style.STROKE);
        mGesturePaint.setStrokeWidth(5);
        mGesturePaint.setColor(Color.WHITE);
        // TODO Auto-generated constructor stub
    }

    public void drawCanvas() {
        try {
            canvas = sfh.lockCanvas();
            if (canvas != null) {
                canvas.drawColor(Color.BLACK);
                canvas.drawPath(mPath, mGesturePaint);
            }
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            if (canvas != null)
                sfh.unlockCanvasAndPost(canvas);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        // TODO Auto-generated method stub
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                invalidate();
                return true;

            case MotionEvent.ACTION_MOVE:
                if (isDrawing)
                {
                    Rect rect = touchMove(event);
                    if (rect != null) {
                        invalidate(rect);
                    }
                    return true;
                }           
                break;
            case MotionEvent.ACTION_UP:
                if (isDrawing)
                {
                    touchUp(event);
                    invalidate();
                    return true;
                }
                break;        
        }
        return super.onTouchEvent(event);
    }

    private void touchDown(MotionEvent event)
    {
        isDrawing = true;
        mPath.reset();
        float x = event.getX();
        float y = event.getY();

        mX = x;
        mY = y;

        mPath.moveTo(x, y);

        mInvalidRect.set((int) x, (int) y, (int) x , (int) y);
        mCurveEndX = x;
        mCurveEndY = y;
    }

    private Rect touchMove(MotionEvent event)
    {
        Rect areaToRefresh = null;

        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);

        if (dx >= 3 || dy >= 3)
        {
            areaToRefresh = mInvalidRect;
            areaToRefresh.set((int) mCurveEndX , (int) mCurveEndY ,
                    (int) mCurveEndX, (int) mCurveEndY);

          //设置贝塞尔曲线的操作点为起点和终点的一半
            float cX = mCurveEndX = (x + previousX) / 2;
            float cY = mCurveEndY = (y + previousY) / 2;

            //实现绘制贝塞尔平滑曲线;previousX, previousY为操作点,cX, cY为终点
            mPath.quadTo(previousX, previousY, cX, cY);
            //mPath.lineTo(x, y);

            // union with the control point of the new curve
            /*areaToRefresh矩形扩大了border(宽和高扩大了两倍border),
             * border值由设置手势画笔粗细值决定
             */
            areaToRefresh.union((int) previousX, (int) previousY,
                    (int) previousX, (int) previousY);
           /* areaToRefresh.union((int) x, (int) y,
                    (int) x, (int) y);*/


            // union with the end point of the new curve
            areaToRefresh.union((int) cX, (int) cY ,
                    (int) cX, (int) cY);

            //第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
            mX = x;
            mY = y;
            drawCanvas();
        }
        return areaToRefresh;
    }

    private void touchUp(MotionEvent event)
    {
        isDrawing = false;
    }
}

以破仑的错

   2). MainActivity:

日前本人在念一本书,书名叫《
世界上那些老牌的信件珍藏》。发现不但我发下会犯傻,伟人也发生犯傻的时候。书中募集了有的以破仑给点儿不管家的情书。其中有雷同封1814年3月勾勒为老二无妻子玛丽·路易丝(奥地利公主)的归依是这么形容的:

package com.feixun.hu.pt;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));
        //setContentView(new DrawingWithBezier(this));
        //setContentView(new DrawingWithoutBezier(this));      
    }
}

Mon Amie (法语:我之爱侣),
过去的几乎上自己中心都以马鞍上过。20号我拿下了
阿奇茨-舍-奥布(法国地名)。
敌军晚上六点时攻击了咱们;我及晚反击,杀敌400总人口。
我们赶快了他们的点滴长达枪,

她俩夺了我们的有限漫长枪,所以一律了。21日,敌军形成作战防卫阵列来保障其主力部队向布里昂跟巴舍奥布进军。我操于马尼以及敌军的维系部队出征,这样即便可以将她们赶得离巴黎远点,并退他们的基地。我今天下午能顶圣迪兹尔。

再见了,Mon Amie。亲我之儿。

Nap

  相关代码下充斥链接:http://download.csdn.net/detail/stevenhu_223/5702603

立马封信后来不幸被他的敌军截获。敌军是由英国,布鲁斯同俄国相当于部队构成的联盟军团。盟军也以要详了法军的行踪,并打败了将破仑。值得一提的凡,盟军总司令布鲁舍将是只绅士,最后要将信教交给了玛丽·路易丝。

智者千虑,必有一失。聪明而将破仑,也会犯愚蠢的荒唐。连日征战的外或许是不过上心于对家人的怀念,而忽视了信件或让段的惊险。这为是由注意力错觉引起。

咱大脑受到的“程序”

这些体会偏差潜伏于咱们的大脑的不知不觉里,它们就象电脑受到的有些序,有的竟是像是病毒,在我们不通过意间运行,让咱做出后后悔末及的错误决定。

俺们的大脑其实就算象台电脑。在婴儿的时光,大脑没有装操作系统,只有脚的硬件自带控制体系于我们会哭,笑和喝奶。慢慢地我们的爹妈叫我们语言,我们也学会了问问题,我们的大脑也初步装了习类程序。

以成人的长河中,各种程序不断安装及大脑中,例如决策程序,问题解决程序,阅读程序,当然还有如下这些多少序:

1 行为习惯

这些习惯是有的我们日常生活中逐渐养成的,一般生麻烦改变。在不同地方或者文化氛围生活会养成不同之行为习惯。因为老以加拿大存,我养成排队离最前边的总人口一如既往米以上的习惯。两年前回国,买动车票时,我吧是如此排队。结果让一个女人直插。我看了看边其他军事,发现只有我一个是如此排队,只得苦笑,往前头动了平等非常步

2 心理障碍

据俗话说的“一通向被蛇咬,十年怕井绳”,一潮终身难忘的过人刺激而人发生了不便改变的心理障碍。

3 瘾

瘾是均等种植对某种物体或移动发生依赖的思状态。比如烟瘾促使爱抽的人明知道吧有害健康为要乐此不疲,酒瘾使酒鬼每天不喝醉誓不罢休,对玩者荣耀上瘾使玩家们有些一有空就手痒难忍,玩上亦然转悠。

4 认知偏差

5 价值观

以我们的成材历程被,慢慢形成了片着力的人生行事原则,这给价值观。

怎要明了周边的咀嚼偏差?

1. 比方我们不明了认知偏差的留存,我们的想就是见面不时被这些大脑被之虫所劫持,导致思路走偏。而只要我们掌握了这些认知偏差的变异原理,我们即便好在琢磨出错后分析我们的笔触,找到影响我们思考的体会偏差。慢慢地,这些认知偏差就不针对咱们的思索形成损伤。

2. 活着受到,会有人使用我们不明了之回味偏差来误导我们的琢磨,让咱们做出错误的操纵。怎么样让误导,我会在背后的多重文章中详述。而而我们懂得了这些可能吃利用的咀嚼偏差,就好对那些骗局还是虚伪广告有免疫力。

生图备受,红色的丝形成的路线是我们如果正常思考要形成的笔触,而少于久斜的蓝色线路则分级代表因我思想中的回味偏差走偏和为他人误导走偏的琢磨方向。

想走偏的星星点点种情况


于后边的文章,我会分享以下内容:

1 常见的咀嚼偏差 (以故事形式)

2 胡会起体味偏差;

3 如何分辨认知偏差 (方法与想框架)

系列文章的目的:

增进自己的写作力和思维力;

除此以外, 如果让有简友学到一点加强思维力的学问就还好了。

迎接学心理学的简友抑或任何简友批评指导。


系文章:

自打众效应

相比效应

注意力错觉

L01E01十万许写书计划 |
恍然大悟

L03E01