`
阅读更多

一个可交互的Android绘制曲线的demo:

 

demo截图

 

 

package com.ray.demo;

import android.app.Activity;
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.graphics.Point;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class LineFunActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }
    
    private class SampleView extends View{
    	public static final int RECT_SIZE = 8;
    	private Point mSelectedPoint = null;

		public static final int POINT_ARRAY_SIZE = 7;
		public static final int C_START = 0;
		public static final int C_END = 1;
		public static final int C_CONTROL_1 = 2;
		public static final int C_CONTROL_2 = 3;
		public static final int Q_START = 4;
		public static final int Q_END = 5;
		public static final int Q_CONTROL = 6;

		private Point[] mPoints = new Point[POINT_ARRAY_SIZE];
		
		public SampleView(Context context) {
			super(context);
			mPoints[C_START] = new Point(100,100);
			mPoints[C_END] = new Point(200,200);
			mPoints[C_CONTROL_1] = new Point (150,100);
			mPoints[C_CONTROL_2] = new Point(150,200);
			
			mPoints[Q_START] = new Point(100,300);
			mPoints[Q_END] = new Point(150,400);
			mPoints[Q_CONTROL] = new Point(200,350);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			canvas.drawColor(Color.WHITE);

			// set up paint
			Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
			paint.setColor(Color.BLACK);

			// draw the cubic line
			Path path = new Path();
			path.moveTo(mPoints[C_START].x,mPoints[C_START].y);
			path.cubicTo(mPoints[C_CONTROL_1].x, mPoints[C_CONTROL_1].y, 
					mPoints[C_CONTROL_2].x, mPoints[C_CONTROL_2].y, 
					mPoints[C_END].x, mPoints[C_END].y);
			paint.setStrokeWidth(2);
			paint.setStyle(Style.STROKE);
			canvas.drawPath(path, paint);
			canvas.drawLine(mPoints[C_START].x,mPoints[C_START].y, 
					mPoints[C_CONTROL_1].x, mPoints[C_CONTROL_1].y, paint);
			canvas.drawLine(mPoints[C_END].x, mPoints[C_END].y, 
					mPoints[C_CONTROL_2].x, mPoints[C_CONTROL_2].y, paint);
			
			// draw the quad line
			paint.setColor(Color.BLACK);
			paint.setStyle(Style.FILL);
			paint.setStrokeWidth(2);
			path.reset();
			path.moveTo(mPoints[Q_START].x, mPoints[Q_START].y);
			path.quadTo(mPoints[Q_CONTROL].x, mPoints[Q_CONTROL].y, 
					mPoints[Q_END].x, mPoints[Q_END].y);
			canvas.drawPath(path, paint);
			canvas.drawLine(mPoints[Q_START].x, mPoints[Q_START].y, 
					mPoints[Q_CONTROL].x, mPoints[Q_CONTROL].y, paint);
			canvas.drawLine(mPoints[Q_END].x, mPoints[Q_END].y, 
					mPoints[Q_CONTROL].x, mPoints[Q_CONTROL].y, paint);
			
			// draw control points
			paint.setColor(Color.RED);
			paint.setStyle(Style.FILL);
			for (int i=0; i<POINT_ARRAY_SIZE; i++){
				canvas.drawRect(pointToRect(mPoints[i]),paint);
			}
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				for (int i=0; i<POINT_ARRAY_SIZE; i++){
					if (pointToRect(mPoints[i]).contains(event.getX(),event.getY())){
						mSelectedPoint = mPoints[i];
					}
				}
				break;
			case MotionEvent.ACTION_MOVE:
				if ( null != mSelectedPoint){			
					mSelectedPoint.x = (int) event.getX();
					mSelectedPoint.y = (int) event.getY();
					invalidate();
				}
				break;
			case MotionEvent.ACTION_UP:
				mSelectedPoint = null;
				break;
			default:
				break;
			}		
			return true;
			
		}
		
		private RectF pointToRect(Point p){
			return new RectF(p.x -RECT_SIZE/2, p.y - RECT_SIZE/2,
					p.x + RECT_SIZE/2, p.y + RECT_SIZE/2);
		}
    }
}
分享到:
评论
4 楼 raymondlueng 2012-06-18  
nsd 写道
好久没你消息了

学习去了,积累不够,呵呵
3 楼 nsd 2012-06-14  
好久没你消息了
2 楼 raymondlueng 2012-05-19  
unicorn25 写道
终于回归了。。。还以为楼主就此休博了呢

谢谢朋友支持!
1 楼 unicorn25 2012-05-17  
终于回归了。。。还以为楼主就此休博了呢

相关推荐

    Android 绘制贝塞尔曲线Demo源码.rar

    以下是一个简单的三次贝塞尔曲线绘制步骤: 1. **创建Path对象**:`Path path = new Path();` 2. **定义曲线路径**:使用`path.moveTo()`设置起点,然后用`path.quadTo()`或`path.cubicTo()`添加曲线。`quadTo()`...

    Android 心电图demo

    每一帧数据更新时,都会调用`onDraw()`方法,根据新的数据点重新绘制曲线。为了流畅地展示心电图,可能还需要使用`SurfaceView`或`GLSurfaceView`,它们支持在后台线程进行绘图,避免阻塞主线程。 **4. 用户界面...

    Android模仿贝尔塞曲线路径动画demo

    "Android模仿贝尔塞曲线路径动画demo"是一个专注于使用贝塞尔曲线创建动态路径的实例。贝塞尔曲线是一种在图形设计和计算机图形学中广泛使用的数学工具,它允许开发者精确地控制曲线的形状,从而实现流畅的动画效果...

    Android用Canvas画曲线图并动态更新Demo

    本示例“Android用Canvas画曲线图并动态更新Demo”旨在教你如何利用Canvas的基本操作来创建一个简单的曲线图,并且能够实时更新其数据。以下是关于这个主题的详细知识讲解。 首先,我们需要了解Canvas的基本概念。...

    路径绘制Demo

    本Demo,"路径绘制Demo",主要展示了如何利用Android的Canvas和Path类来实现直线、二阶贝塞尔曲线的绘制,并且创建了一个能够动态显示波浪形的自定义控件,还支持动画和进度控制功能。下面我们将详细探讨这些知识点...

    android图表绘制工具achartengine-1.1.0

    android图表绘制工具,功能非常强大,几乎涵盖了所有的图表种类。 这是目前最新的版本:1.1.0 包含了3个文件: achartengine-1.1.0.jar, achartengine-1.1.0-demo-source.zip, achartengine-1.1.0-javadocs.zip ...

    android 手写、涂鸦demo

    总的来说,这个"android 手写、涂鸦demo"涵盖了Android图形绘制、用户交互、手势识别等多个核心知识点。开发者可以通过研究这个Demo,了解并掌握如何在Android应用中实现手写和涂鸦功能,从而创建更加丰富的用户界面...

    android手绘操作demo和经典绘图源码Pretty-Painter-master.zip

    "android手绘操作demo和经典绘图源码Pretty-Painter-master.zip"是一个资源包,它包含了Android平台上的一个手绘应用的源代码示例。这个项目,名为“Pretty-Painter”,旨在帮助开发者了解和学习如何在Android上实现...

    Android-学习贝塞尔曲线时写的Demo整理了部分代码

    在Android开发中,贝塞尔曲线(Bezier Curve)是一...通过学习和分析这个Demo,开发者可以深入理解贝塞尔曲线在Android中的应用,如何创建和控制曲线,以及如何将它们融入到实际项目中,提升图形绘制和动画效果的水平。

    android 曲线图highchartdemo

    在Android开发中,有时我们需要展示数据的动态变化或者复杂的数据关系,这时曲线图就成为了一个很好的选择。Highcharts是一款强大的JavaScript图表库,它能够轻松创建各种类型的图表,包括折线图、柱状图、饼图等。...

    android曲线图源码

    在Android开发中,曲线图是一种常见的数据可视化工具,尤其在展示动态...总之,Android曲线图的实现涉及图形渲染、数据绑定等多个环节,通过学习和实践,你不仅可以掌握曲线图的绘制,还能提升对Android UI编程的理解。

    贝塞尔曲线实现特殊效果demo

    在这个"贝塞尔曲线实现特殊效果demo"中,我们将深入探讨贝塞尔曲线的基本概念、计算方法以及如何在Android平台上利用源码实现酷炫的视觉效果。 贝塞尔曲线的定义始于法国工程师皮埃尔·贝塞尔,它是一种参数化的...

    android 物体移动demo

    总结来说,"android 物体移动demo"涵盖了Android应用开发中的基本动画和图形技术,包括使用SurfaceView和Canvas进行绘制,控制物体移动,处理用户交互,以及进行性能优化等。通过学习和实践这个demo,开发者可以更好...

    Android 手绘 Demo(支持保存为图片)

    本文将深入探讨如何在Android平台上实现一个手绘Demo,并且支持将绘制的内容保存为图片。这个Demo的源代码来源于CSDN博主z1074971432的一篇文章,具体链接为:...

    Android 书籍翻页效果的demo.zip

    这个"Android 书籍翻页效果的demo.zip"包含了一个示例项目,展示了如何在Android平台上创建逼真的翻页动画。下面将详细探讨这种效果的实现原理和关键知识点。 首先,Android书籍翻页效果主要依赖于图形库和动画系统...

    Android等级进度条demo

    本示例“Android等级进度条demo”就是这样一个实例,它展示了一个自定义View,用于呈现用户的等级或进度状态。下面将详细探讨这个Demo所涉及的核心知识点。 1. **自定义View的基本步骤** - 创建一个新的Java类,...

    Android贝塞尔曲线的简单应用之------实现自定义圆形控件内水波纹自动上升效果Demo

    在Android中,我们可以使用Path类的quadTo()、cubicTo()等方法来绘制贝塞尔曲线。在这个特定的Demo中,我们将使用三次贝塞尔曲线,它由四个控制点定义,可以创建更复杂的形状和运动路径。 创建自定义圆形控件通常...

    android 百度地图demo 在地图上划出轨迹

    根据提供的文件信息,我们可以归纳出以下关于“在Android百度地图Demo中绘制轨迹”的知识点: ### 一、背景介绍 在Android应用开发过程中,特别是在需要地理定位功能的应用中,地图服务是必不可少的一部分。百度...

    Android高级应用源码-android手绘操作demo和经典绘图源码Pretty-Painter-master.rar

    android手绘操作demo和经典绘图源码Pretty-Painter-master.rar"这个压缩包包含了一个名为"Pretty-Painter"的项目,它是一个经典的Android手绘应用的源码示例,可以帮助开发者深入理解Android图形绘制机制。...

    Android2D练习一demo1

    本练习"Android2D练习一demo1"旨在帮助初学者掌握Android 2D图形的基本绘制方法。通过这个demo,我们可以了解如何在Android应用中利用Canvas、View以及Paint等关键组件进行图形绘制。 首先,`Canvas`是Android中...

Global site tag (gtag.js) - Google Analytics