自定义控件(31)---贝塞尔曲线

来源:互联网 发布:删除表数据 truncate 编辑:程序博客网 时间:2024/06/05 02:29

布局文件

    <com.safly.myapplication.CustomeWaitingProgressBar2        android:id="@+id/skipView2"        android:layout_width="fill_parent"        android:layout_height="fill_parent">    </com.safly.myapplication.CustomeWaitingProgressBar2>
package com.safly.myapplication;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;public class CustomeWaitingProgressBar2 extends View {    private Path mPath = new Path();    public CustomeWaitingProgressBar2(Context context) {        super(context);    }    public CustomeWaitingProgressBar2(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i("MotionEvent","ACTION_DOWN");                mPath.moveTo(event.getX(), event.getY());                return true;            case MotionEvent.ACTION_MOVE:                Log.i("MotionEvent","ACTION_MOVE");                mPath.lineTo(event.getX(), event.getY());                postInvalidate();                break;            default:                break;        }//        return true; 将ACTION_DOWN改成break;        return super.onTouchEvent(event);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        Paint paint = new Paint();        paint.setColor(Color.RED);        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeWidth(2);        canvas.drawPath(mPath,paint);    }    public void reset(){        mPath.reset();        invalidate();    }}


看看贝塞尔曲线实现的方式:
这里写图片描述

 private float mPreX,mPreY;    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:{                mPath.moveTo(event.getX(),event.getY());                mPreX = event.getX();                mPreY = event.getY();                return true;            }            case MotionEvent.ACTION_MOVE:{                float endX = (mPreX+event.getX())/2;                float endY = (mPreY+event.getY())/2;                mPath.quadTo(mPreX,mPreY,endX,endY);                mPreX = event.getX();                mPreY =event.getY();                invalidate();            }            break;            default:                break;        }        return super.onTouchEvent(event);    }

这里写图片描述


public void rQuadTo(float dx1, float dy1, float dx2, float dy2)

    dx1:控制点X坐标,表示相对上一个终点X坐标的位移坐标,可为负值,正值表示相加,负值表示相减;    dy1:控制点Y坐标,相对上一个终点Y坐标的位移坐标。同样可为负值,正值表示相加,负值表示相减;    dx2:终点X坐标,同样是一个相对坐标,相对上一个终点X坐标的位移值,可为负值,正值表示相加,负值表示相减;    dy2:终点Y坐标,同样是一个相对,相对上一个终点Y坐标的位移值。可为负值,正值表示相加,负值表示相减; 

比如,我们上一个终点坐标是(300,400)那么利用rQuadTo(100,-100,200,100);
得到的控制点坐标是(300+100,400-100)即(400,300)
同样,得到的终点坐标是(300+200,400+100)即(500,500)
所以下面这两段代码是等价的:
利用quadTo定义绝对坐标

path.moveTo(300,400);  path.quadTo(400,300,500,500);--------path.moveTo(300,400);  path.rQuadTo(100,-100,200,100)
0 0
原创粉丝点击