Android中贝塞尔曲线的绘制方法示例代码_Android

       贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线。

       上面的介绍中,“线段像可伸缩的皮筋”这句话非常关键,但也特别好理解。至于贝塞尔曲线的详细内容大家可以查阅相关资料。

       Android提供的贝塞尔曲线绘制接口

       在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提供了相关接口,但此接口方法被藏的有点深,藏于Path类中。此方法如下:

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

       Since: API Level 1

       参数说明:

       x1:操作点的x坐标

       y1:操作点的y坐标

       x2:结束点的x坐标

       y2:结束点的y坐标

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

       Android贝塞尔曲线的绘制实例

       熟悉方法后,下面就来实现:

       SurfaceView框架不多讲,看过我博客的都应该知道的。

       直接看MySurfaceView类,此类继承SurfaceView,是游戏的主视图。

       这里为了更清晰的讲解:这里部分代码先不贴出来了,最后会整体贴出。

       首先是定义相关的成员变量:

Java代码

// 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标)
private int startX, startY, controlX, controlY, endX, endY;
// Path
private Path path;
// 为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔
private Paint paintQ;
// 随机库(让贝赛尔曲线更明显)
private Random random; 

          本类构造函数:

Java代码

/**
 * SurfaceView初始化函数
 */
public MySurfaceView(Context context) {
 super(context);
 ...
  //贝赛尔曲线相关初始化
  path = new Path();
  paintQ = new Paint();
  paintQ.setAntiAlias(true);
  paintQ.setStyle(Style.STROKE);
  paintQ.setStrokeWidth(5);
  paintQ.setColor(Color.WHITE);
  random = new Random();
 ...
} 

            接着我把贝赛尔曲线的绘制封装成一个方法了,函数如下:

Java代码

/**
 * 绘制贝赛尔曲线
 *
 * @param canvas 主画布
 */
public void drawQpath(Canvas canvas) {
 path.reset();// 重置path
 // 贝赛尔曲线的起始点
 path.moveTo(startX, startY);
 // 设置贝赛尔曲线的操作点以及终止点
 path.quadTo(controlX, controlY, endX, endY);
 // 绘制贝赛尔曲线(Path)
 canvas.drawPath(path, paintQ);
} 

          最后是用户触屏监听函数以及逻辑函数:

Java代码

/**
 * 触屏事件监听
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
 endX = (int) event.getX();
 endY = (int) event.getY();
 return true;
}
/**
 * 游戏逻辑
 */
private void logic() {
 if (endX != 0 && endY != 0) {
  // 设置操作点为线段x/y的一半
  controlX = random.nextInt((endX - startX) / 2);
  controlY = random.nextInt((endY - startY) / 2);
 }
} 

       整个代码很easy,主要是贝赛尔函数的参数,尤其是操作点,操作点的各种不同可以实现不同的效果,这里我简单的统一的讲操作点设置成用户触屏点的x、y的一半,呵呵偷懒了~~

       我把贝赛尔的操作点写在了逻辑logic()函数中,不断的执行,并且每次利用nextInt函数得到随机的操作点,主要为了让其曲线不断的变化从而形成一个震动的曲线运动轨迹。

       运行效果截图如下:

        这里可能由于图片是静止的,所以效果看起来不是很明显,大家可以运行源码来观察。

       下面贴出整个MySurfaceView的源码:

Java代码

package com.qpath;
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
 * 赛贝尔曲线
 * @author Himi
 *
 */
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
 private SurfaceHolder sfh;
 private Paint paint;
 private Thread th;
 private boolean flag;
 private Canvas canvas;
 public static int screenW, screenH;
 // -----------以上是SurfaceView游戏框架
 // 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标)
 private int startX, startY, controlX, controlY, endX, endY;
 // Path
 private Path path;
 // 为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔
 private Paint paintQ;
 // 随机库(让贝赛尔曲线更明显)
 private Random random;
 /**
  * SurfaceView初始化函数
  */
 public MySurfaceView(Context context) {
  super(context);
  sfh = this.getHolder();
  sfh.addCallback(this);
  paint = new Paint();
  paint.setColor(Color.WHITE);
  paint.setAntiAlias(true);
  setFocusable(true);
  // -----------以上是SurfaceView游戏框架
  //贝赛尔曲线相关初始化
  path = new Path();
  paintQ = new Paint();
  paintQ.setAntiAlias(true);
  paintQ.setStyle(Style.STROKE);
  paintQ.setStrokeWidth(5);
  paintQ.setColor(Color.WHITE);
  random = new Random();
 }
 /**
  * SurfaceView视图创建,响应此函数
  */
 public void surfaceCreated(SurfaceHolder holder) {
  screenW = this.getWidth();
  screenH = this.getHeight();
  flag = true;
  // 实例线程
  th = new Thread(this);
  // 启动线程
  th.start();
  // -----------以上是SurfaceView游戏框架
 }
 /**
  * 游戏绘图
  */
 public void myDraw() {
  try {
   canvas = sfh.lockCanvas();
   if (canvas != null) {
    canvas.drawColor(Color.BLACK);
    // -----------以上是SurfaceView游戏框架
    drawQpath(canvas);
   }
  } catch (Exception e) {
   // TODO: handle exception
  } finally {
   if (canvas != null)
    sfh.unlockCanvasAndPost(canvas);
  }
 }
 /**
  * 绘制贝赛尔曲线
  *
  * @param canvas 主画布
  */
 public void drawQpath(Canvas canvas) {
  path.reset();// 重置path
  // 贝赛尔曲线的起始点
  path.moveTo(startX, startY);
  // 设置贝赛尔曲线的操作点以及终止点
  path.quadTo(controlX, controlY, endX, endY);
  // 绘制贝赛尔曲线(Path)
  canvas.drawPath(path, paintQ);
 }
 /**
  * 触屏事件监听
  */
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  endX = (int) event.getX();
  endY = (int) event.getY();
  return true;
 }
 /**
  * 游戏逻辑
  */
 private void logic() {
  if (endX != 0 && endY != 0) {
   // 设置操作点为线段x/y的一半
   controlX = random.nextInt((endX - startX) / 2);
   controlY = random.nextInt((endY - startY) / 2);
  }
 }
 /**
  * 按键事件监听
  */
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  return super.onKeyDown(keyCode, event);
 }
 public void run() {
  while (flag) {
   long start = System.currentTimeMillis();
   myDraw();
   logic();
   long end = System.currentTimeMillis();
   try {
    if (end - start < 50) {
     Thread.sleep(50 - (end - start));
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 /**
  * SurfaceView视图状态发生改变,响应此函数
  */
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }
 /**
  * SurfaceView视图消亡时,响应此函数
  */
 public void surfaceDestroyed(SurfaceHolder holder) {
  flag = false;
 }
} 

          以上就是对Android 贝塞尔曲线的绘制的示例代码,后续继续补充相关知识,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
贝塞尔曲线
绘制贝塞尔曲线、wpf 绘制贝塞尔曲线、canvas绘制贝塞尔曲线、opengl绘制贝塞尔曲线、ios 绘制贝塞尔曲线,以便于您获取更多的相关知识。

时间: 2024-09-08 11:04:44

Android中贝塞尔曲线的绘制方法示例代码_Android的相关文章

Android中贝塞尔曲线的绘制方法示例代码

贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线. 上面的介绍中,"线段像可伸缩的皮筋"这句话非常关键,但也特别好理解.至于贝塞尔曲线的详细内容大家可以查阅相关资料. Android提供的贝塞尔曲线绘制接口 在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提供了相关接口,

Android中js和原生交互的示例代码

本文介绍了Android中js和原生交互的示例代码,分享给大家,具体如下: 加载webview的类 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JavaScriptInterf

Android中自定义一个View的方法详解_Android

本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到一些坑,我把自己遇到的一些问题和解决方法总结一下,希望对广大码友们有所帮助. 注意点① 用xml定义Layout时,Root element 最好使用merge 当我们需要继承一个布局比较复杂的ViewGroup(比较多的是LinearLayout.RelativeLayout)时,通常会用xml来

Android中常用的XML生成方法实例分析_Android

本文实例讲述了Android中常用的XML生成方法.分享给大家供大家参考.具体如下: 1. java代码: package com.android.antking.xml; import java.io.OutputStream; import java.util.List; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; /**采用pull 生成xml文件 * * @author antkingwei * */ pub

Android 对话框(Dialog)大全详解及示例代码_Android

Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog). onCreateDialog(int):当你使用这个回调函数时,Android系统会有效的设置这个Acti

android中贝塞尔曲线的应用示例

前言: 贝塞尔曲线又称贝兹曲线,它的主要意义在于无论是直线或曲线都能在数学上予以描述.最初由保罗·德卡斯特里奥(Paul de Casteljau)于1959年运用德卡斯特里奥演算法开发(de Casteljau Algorithm),在1962,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表.目前广泛应用于图形绘制领域来模拟光滑曲线,为计算机矢量图形学奠定了基础.在一些图形处理软件中都能见到贝塞尔曲线,比如CorelDraw中翻译成"贝赛尔工具":而在Firewo

Android中Service和Activity相互通信示例代码

前言 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,本文就给大家详细介绍了关于Android中Service和Activity相互通信的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Activity向Service通信 第一种方式:通过MyBinder方式调用Service方法 MainActivity public class Ma

Android 进度条使用详解及示例代码_Android

在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先来找图看看,做这个图完成不用图片就可以做到了. 看下xml布局文件,其实就是直接用xml写的在加两个属性设置一下就好了,一个style,另一个是background. <ProgressBar android:id="@+id/pb_progressbar" style="

Android实现带有删除按钮的EditText示例代码_Android

一.首先来看看效果 这是一个带有删除按钮的输入文本框, 需要新建一个类继承自EditText, 先把代码贴出来, 然后在解释: 示例代码如下: public class EditTextWithDel extends EditText { private final static String TAG = "EditTextWithDel"; private Drawable imgInable; private Context mContext; public EditTextWit