创建android画笔程序的例子(有镜面效果)

先上图:

关键是在检测到手指移动的时候用mPath.quadTo的方法,android sdk解释是:

Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0).

中文是用贝塞尔曲线链接了(x1,y1),(x2,y2)这两个点,如果没有moveTo()这个方法调用的话,第一个点默认为(0,0)

android画图是用Canvas的API,如画一个实心的矩形,可以用在重写一个View的onDraw():

<span style="white-space:pre">		</span>Rect rect = new Rect(100,100,500,500);
		mPaint.setStrokeWidth(5); //设置画笔的粗细
		mPaint.setColor(Color.RED); //设置画笔的颜色
		mPaint.setStyle(Style.FILL); //填充整个图形
		mPaint.setAntiAlias(true); //抗锯齿效果
		canvas.drawRect(rect, mPaint);

对于检测手指的移动,我们可以用onTouchEvent来实现:

	private float mX, mY;
	private float mOppositeX, mOppositeY;
	private static final float TOUCH_TOLERANCE = 4; //当手指移动超过4时我们才去set Path

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		float x = event.getX();
		float y = event.getY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			touch_start(x, y);
			if(isMirrorDraw) {
				touch_opposite_start(x, y);
			}
			invalidate();
			break;
		case MotionEvent.ACTION_MOVE:
			touch_move(x, y);
			if(isMirrorDraw) {
				touch_opposite_move(x, y);
			}
			invalidate();
			break;
		case MotionEvent.ACTION_UP:
			touch_up();
			if(isMirrorDraw) {
				touch_opposite_up();
			}
			invalidate();
			break;
		}
		return true;
	}

	private void touch_start(float x, float y) {
		mPath.reset();
		mPath.moveTo(x, y);
		mX = x;
		mY = y;
	}

	private void touch_move(float x, float y) {
		float dx = Math.abs(x - mX);
		float dy = Math.abs(y - mY);
		if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
			mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
			mX = x;
			mY = y;
		}
	}

	private void touch_up() {
		mPath.lineTo(mX, mY);
		mCanvas.drawPath(mPath, mPaint);
		mPath.reset();
	}

	private void touch_opposite_up() {
		mOppositePath.lineTo(mOppositeX, mY);
		mCanvas.drawPath(mOppositePath, mOppoPaint);
		mOppositePath.reset();
	}

	private void touch_opposite_move(float x, float y) {
		float oppositeX = OppositeDrawActivity.screenWidth - x; //<span style="font-family: Arial, Helvetica, sans-serif;">OppositeDrawActivity.screenWidth是屏幕宽度</span>
		float dx = Math.abs(oppositeX - mOppositeX);
		float dy = Math.abs(y - mY);
		if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
			mOppositePath.quadTo(mOppositeX, mY, (mOppositeX + oppositeX) / 2, (y + mY) / 2);
			mOppositeX = oppositeX;
			mY = y;
		}
	}

	private void touch_opposite_start(float x, float y) {
		mOppositePath.reset();
		float oppositeX = OppositeDrawActivity.screenWidth - x;
		mOppositePath.moveTo(oppositeX, y);
		mOppositeX = oppositeX;

	}

然后重写onDraw():

@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawColor(0xFFAAAAAA);
		canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
		canvas.drawPath(mPath, mPaint);
		if(isMirrorDraw) {
			canvas.drawPath(mOppositePath, mOppoPaint);
		}
	}

代码可以在http://download.csdn.net/detail/baidu_nod/7572549下载

创建android画笔程序的例子(有镜面效果)

时间: 2024-10-07 23:06:46

创建android画笔程序的例子(有镜面效果)的相关文章

创建android画笔程序的样例(有镜面效果)

先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0

Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应用程序与SurfaceFlinger服务的连接过程了.连接上SurfaceFlinger服务之后,Android应用程序就可以请求SurfaceFlinger服务创建Surface.而当有了Surface后,Android应用程序就可以用来渲染自己的UI了.在本文中,我们将详细分析Android应用

Xamarin.Android使用教程之创建第一个Android应用程序

<Xamarin Platform 试用版下载地址> 在本文中,我们将使用Xamarin创建第一个Android应用程序. 安装完Xamarin之后,在Visual Studio中点击File-> New Project,你应该可以在可用模板中看见一个Android选项. 继续并选择"Blank App (Android)",然后单击确定. Xamarin继续运行,然后创建你的第一个"Hello World"应用程序. 如果你只运行该应用程序,请确

用 Eclipse 开发 Android 应用程序

转自:http://www.apkbus.com/android-13828-1-1.html 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程序.第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段.第二个应用程序示例涉及比较复杂的 Android 特性,包括联系人搜索和 Google Maps 地址查找.要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的.开发 Android 应用程序需要 Java? 编程技能,但是对

Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析

http://blog.csdn.net/luoshengyang/article/details/8223770 在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程.由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口.由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的.在本文中,我们就将详细分析Android应用程序窗口

Android应用程序窗口(Activity)的视图对象(View)的创建过程分析

从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口.每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图.应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的.在本文中,我们就详细分析应用程序窗口视图的创建过程. 在前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中提到,应用程序

Android使用AndEngine创建第一个程序

首先要把andengine.jar复制到libs文件夹里 01 package com.hu.anden; 02   03 import org.anddev.andengine.engine.Engine; 04 import org.anddev.andengine.engine.camera.Camera; 05 import org.anddev.andengine.engine.options.EngineOptions; 06 import org.anddev.andengine.

Android应用程序中的多个Activity的显示创建和调用

布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orien

JAVA Eclipse创建Android程序界面不显示怎么办

一般是由于你创建的Android应用程序版本太高导致的,请设置4或以下版本,对于已有的项目,可以在属性-Android中修改目标生成的版本号 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?