android贝塞尔曲线的简单应用
2016-02-25 11:31
459 查看
需求:开始有个四分之一圆弧曲线,通过手指滑动,曲线慢慢变成直线
分析:通过观察,发现该view可以通过绘制特定path的内容来实现曲线的变化,正好android,Paht类提供了quadTo方法:
而我们的需求是曲线慢慢变化成直线,这就要求参考点和结束点不断的变化,这就可以通过重写view的onTouchEvent时间来实现:关键代码如下:
通过调用invalidate重绘控件:
分析:通过观察,发现该view可以通过绘制特定path的内容来实现曲线的变化,正好android,Paht类提供了quadTo方法:
android.graphics.Path.quadTo(float x1, float y1, float x2, float y2)前两个参数确认了一个点(参考点);后面两个参数确认最终结束的点;
而我们的需求是曲线慢慢变化成直线,这就要求参考点和结束点不断的变化,这就可以通过重写view的onTouchEvent时间来实现:关键代码如下:
public boolean onTouchEvent(MotionEvent event) { Log.i("wrx226", "myView---onInterceptTouchEvent---"); int action = event.getAction(); switch(action) { case MotionEvent.ACTION_DOWN: mFirstX = event.getX(); mFirstY = event.getY(); startTime = System.currentTimeMillis(); break; case MotionEvent.ACTION_MOVE: diffY = event.getY() - mFirstY; if (diffY > 0) { diffY = 0; } invalidate(); break; case MotionEvent.ACTION_UP: long diffTime = System.currentTimeMillis() - startTime; float diffSpeed = diffY / diffTime; if (-diffSpeed > 0.5) { //执行往上的动画并解锁 animator = ValueAnimator.ofFloat(diffY, -getMeasuredHeight()); animator.setDuration(400); animator.setInterpolator(new DecelerateInterpolator(4.0f)); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { diffY = (float) animation.getAnimatedValue(); Log.i("wrx1009", "diffY = " + diffY); invalidate(); } }); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { Log.i("wrx1009", "---animator is end---"); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animator.start(); } else { //执行往下的动画并回到初始状态 animator = ValueAnimator.ofFloat(diffY, 0); animator.setDuration(400); animator.setInterpolator(new BounceInterpolator()); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { diffY = (float) animation.getAnimatedValue(); Log.i("wrx1009", "diffY = " + diffY); invalidate(); } }); animator.start(); } break; } return true; }
通过调用invalidate重绘控件:
protected void onDraw(Canvas canvas) { super.onDraw(canvas); int diffHeight = getMeasuredHeight() - circleHeight - rectHeight; if (diffY >= -circleHeight) { mPath.reset(); mPath.moveTo(480, diffHeight); mPath.quadTo(480, diffHeight + circleHeight + diffY, 360, diffHeight + circleHeight + diffY); mPath.lineTo(0, diffHeight + circleHeight + diffY); mPath.lineTo(0, getMeasuredHeight() + diffY); mPath.lineTo(480, getMeasuredHeight() + diffY); mPath.lineTo(480, diffHeight); mPath.close(); canvas.drawPath(mPath, mPaint); } else { mPath.reset(); mPath.moveTo(480, diffHeight + circleHeight + diffY); mPath.lineTo(0, diffHeight + circleHeight + diffY); mPath.lineTo(0, getMeasuredHeight() + diffY); mPath.lineTo(480, getMeasuredHeight() + diffY); mPath.lineTo(480, diffHeight + circleHeight + diffY); mPath.close(); canvas.drawPath(mPath, mPaint); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories