本文主要是介绍自定义控件(31)---贝塞尔曲线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
布局文件
<com.safly.myapplication.CustomeWaitingProgressBar2android: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);}@Overridepublic 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);}@Overrideprotected 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;@Overridepublic 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)
这篇关于自定义控件(31)---贝塞尔曲线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!