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>
运行效果(不够顺滑)
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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: ThinkPHP验证码使用简明教程