欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android贝塞尔曲线实现手指轨迹

程序员文章站 2023-11-30 10:56:58
本文实例为大家分享了android贝塞尔曲线实现手指轨迹的具体代码,供大家参考,具体内容如下 1、使用贝塞尔曲线前 myview.java public cl...

本文实例为大家分享了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>

运行效果(不够顺滑)

Android贝塞尔曲线实现手指轨迹

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(); 
  } 

}

Android贝塞尔曲线实现手指轨迹

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