【转】【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!

Himi原创,转载务必注明出处!

  原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/06/20/6555828.aspx

首先对于《赛贝尔曲线》不是很了解的童鞋,请自觉白度百科、google等等...

为了方便偷懒的童鞋,这里给个《贝赛尔曲线》百科地址,以及一段话简述《贝赛尔曲线》:

《贝赛尔曲线》白度百科快速地址:http://baike.baidu.com/view/4019466.htm

贝塞尔曲线又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋;

上面这一段话其实就“线段像可伸缩的皮筋”这一句比较重要,也很容易理解;

        至于贝赛尔曲线的实现,在Android中极其的简单,因为它是Android封装的一个方法,这个能不简单么。。。。。。只不过它隐藏的比较深,它隐藏于Path类中,方法如下:

android.graphics.Path.quadTo(float x1, float y1, float x2, float y2)

Since: API Level 1

此方参数解释:

第一个参数:操作点的x坐标

第二个参数:操作点的y坐标

第三个参数:结束点的x坐标

第四个参数:结束点的y坐标

从API中看出,赛贝尔曲线从API-1就开始支持了;

public class Bezier extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(new BezierView(this));
	}
	
	private class BezierView extends SurfaceView implements Callback,Runnable{
		private int mStartX;
		private int mStartY;
		private int mControlX;
		private int mControlY;
		private int mEndX;
		private int mEndY;
		private Random mRandom;
		private Path mPath;
		private Paint mPaint;
		private boolean mIsFlag=false;
		private int mScreenWidth;
		private int mScreenHeight;
		
		private SurfaceHolder mSurfaceHolder;
		private Canvas mCanvas;
		private Thread mThread;

		public BezierView(Context context) {
			super(context);
			mSurfaceHolder=this.getHolder();
			mSurfaceHolder.addCallback(this);
			
			mPath=new Path();
			mPaint=new Paint();
			mPaint.setAntiAlias(true);
			mPaint.setStyle(Style.STROKE);
			mPaint.setStrokeWidth(5);
			mPaint.setColor(Color.WHITE);
			mRandom=new Random();
			
			setFocusableInTouchMode(true);
		}

		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			mScreenWidth=getWidth();
			mScreenHeight=getHeight();
			mIsFlag=true;
			mThread=new Thread(this);
			mThread.start();
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			mIsFlag=false;
		}

		@Override
		public void run() {
			while(mIsFlag){
				doDraw();
				doLogic();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

		private void doLogic() {
			if (mEndX!=0&&mEndY!=0) {
				mControlX=mRandom.nextInt((mEndX-mStartX)/2);
				mControlY=mRandom.nextInt((mEndY-mStartY)/2);
			}
		}

		private void doDraw() {
			try {
				mCanvas=mSurfaceHolder.lockCanvas();
				if (mCanvas!=null) {
					mCanvas.drawColor(Color.BLACK);
					drawPath();
				}
			} catch (Exception e) {
				// TODO: handle exception
			}finally{
				if (mCanvas!=null) {
					mSurfaceHolder.unlockCanvasAndPost(mCanvas);
				}
			}
			
			
		}
		
		private void drawPath() {
			mPath.reset();
			mPath.moveTo(mStartX, mStartY);
			mPath.quadTo(mControlX, mControlY, mEndX, mEndY);
			mCanvas.drawPath(mPath, mPaint);
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			mEndX=(int)event.getX();
			mEndY=(int)event.getY();
			return true;
		}
		
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值