本文实例为大家分享了Android贝塞尔曲线实现手指轨迹的具体代码,供大家参考,具体内容如下

1、使用贝塞尔曲线前

MyView.java

public class MyView extends View {

 // 实例一个路径对象
 private Path mPath = new Path();

 public MyView(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
 }

 public MyView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  // TODO Auto-generated method stub
  switch (event.getAction()) {
  // 按下
  case MotionEvent.ACTION_DOWN:
   //getX()和getY()获得的永远是相对view的触摸位置坐标
   mPath.moveTo(event.getX(), event.getY());
   // return true表示当前控件已经消费了下按动作,
   // 之后的ACTION_MOVE、ACTION_UP动作也会继续传递到当前控件中
   return true;
   // 移动
  case MotionEvent.ACTION_MOVE:
   mPath.lineTo(event.getX(), event.getY());
   // postInvalidate用来重绘控件,在非UI线程中使用
   postInvalidate();
  default:
   break;
  }
  return super.onTouchEvent(event);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  // 实例一个画笔并设置画笔样式
  Paint paint = new Paint();
  paint.setColor(Color.RED);
  paint.setStyle(Paint.Style.STROKE);// 填充样式改为描边
  // 路径和画笔联合绘制成图形
  canvas.drawPath(mPath, paint);
 }

 public void reset() {
  // 清除掉path里的线条和曲线,但是不会改变它的fill-type
  mPath.reset();
  //刷新View,清屏
  invalidate();
 }
}

MyActivity.java

public class MyActivity extends Activity {
 MyView myView;
 Button reset;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.gesture);
  myView = (MyView) findViewById(R.id.myView);
  reset = (Button) findViewById(R.id.reset);
  reset.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    myView.reset();
   }
  });
 }

}

gesture.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
 <Button
  android:id="@ id/reset"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="reset" />
 <com.example.gesture.MyView
  android:id="@ id/myView"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
</LinearLayout>

运行效果(不够顺滑)


2、使用贝塞尔曲线后

将上面函数lineTo()改为quadTo()

public class MySecondView extends View {
 private Path mPath=new Path();
 private float mPreX,mPreY;

 public MySecondView(Context context) {
  super(context);
 }

 public MySecondView(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  // TODO Auto-generated method stub
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   //将Path的初始位置设置到手指的触点处
    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;
   //quadTo前两个参数是控制点,后两个是终点
   mPath.quadTo(mPreX, mPreY, endX, endY);
   mPreX=event.getX();
   mPreY=event.getY();
   invalidate();
  default:
   break;
  }
  return super.onTouchEvent(event);
 }
  @Override 
  protected void onDraw(Canvas canvas) { 
   super.onDraw(canvas); 
   Paint paint = new Paint(); 
   paint.setStyle(Paint.Style.STROKE); 
   paint.setColor(Color.RED); 
   paint.setStrokeWidth(2); 
   canvas.drawPath(mPath,paint); 
  } 

  public void reset(){ 
   mPath.reset(); 
   postInvalidate(); 
  } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Android贝塞尔曲线实现手指轨迹的更多相关文章

  1. 基于canvas使用贝塞尔曲线平滑拟合折线段的方法

    这篇文章主要介绍了基于canvas使用贝塞尔曲线平滑拟合折线段的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 使用SVG实现提示框功能的示例代码

    这篇文章主要介绍了使用SVG实现提示框功能的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动

    这篇文章主要介绍了canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. canvas仿写贝塞尔曲线的示例代码

    这篇文章主要介绍了canvas仿写贝塞尔曲线的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  8. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  9. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  10. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部