当前位置: 代码迷 >> Android >> Android中利用画图类跟线程画出闪烁的心形,送给亲爱的他
  详细解决方案

Android中利用画图类跟线程画出闪烁的心形,送给亲爱的他

热度:34   发布时间:2016-05-01 14:04:23.0
Android中利用画图类和线程画出闪烁的心形,送给亲爱的他
    大家先看图片:


因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:
里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承surfaceview的类,我们在这里面画图。先贴两个累的代码:
主类名:iaiaimainactivity,画图类类名:love.

package com.iaiai.activity;import android.app.activity;import android.os.bundle;/** *  * <p> * title: iaiaiactivity.java * </p> * <p> * e-mail: [email protected] * </p> * <p> * qq: 176291935 * </p> * <p> * http: iaiai.iteye.com * </p> * <p> * create time: 2011-8-11 * </p> *  * @author 丸子 * @version 0.0.1 */public class iaiaiactivity extends activity {	@override	public void oncreate(bundle savedinstancestate) {		super.oncreate(savedinstancestate);		love love = new love(this);		setcontentview(love);	}}


package com.iaiai.activity;import android.content.context;import android.graphics.canvas;import android.graphics.color;import android.graphics.paint;import android.graphics.rectf;import android.graphics.typeface;import android.view.surfaceholder;import android.view.surfaceview;/** *  * <p> * title: love.java * </p> * <p> * e-mail: [email protected] * </p> * <p> * qq: 176291935 * </p> * <p> * http: iaiai.iteye.com * </p> * <p> * create time: 2011-8-11 * </p> *  * @author 丸子 * @version 0.0.1 */public class love extends surfaceview implements surfaceholder.callback,		runnable {	boolean mbloop = false;	surfaceholder msurfaceholder = null;	private canvas canvas;	int micount = 0;	int y = 50;	/**	 * @param context	 */	public love(context context) {		super(context);		msurfaceholder = this.getholder();		msurfaceholder.addcallback(this);		this.setfocusable(true);		this.setkeepscreenon(true);		mbloop = true;	}	/*	 * (non-javadoc)	 * 	 * @see	 * android.view.surfaceholder.callback#surfacechanged(android.view.surfaceholder	 * , int, int, int)	 */	@override	public void surfacechanged(surfaceholder holder, int format, int width,			int height) {		// todo auto-generated method stub	}	/*	 * (non-javadoc)	 * 	 * @see	 * android.view.surfaceholder.callback#surfacecreated(android.view.surfaceholder	 * )	 */	@override	public void surfacecreated(surfaceholder holder) {		// todo auto-generated method stub		new thread(this).start();	}	/*	 * (non-javadoc)	 * 	 * 	 * @seeandroid.view.surfaceholder.callback#surfacedestroyed(android.view.	 * surfaceholder)	 */	@override	public void surfacedestroyed(surfaceholder holder) {		// todo auto-generated method stub		mbloop = false;	}	/*	 * (non-javadoc)	 * 	 * @see java.lang.runnable#run()	 */	@override	public void run() {		// todo auto-generated method stub		while (mbloop) {			try {				thread.sleep(200);			} catch (exception e) {				// todo: handle exception			}			synchronized (msurfaceholder) {				draw();			}		}	}	private void draw() {		// todo auto-generated method stub		canvas = msurfaceholder.lockcanvas();		try {			if (msurfaceholder == null || canvas == null) {				return;			}			if (micount < 100) {				micount++;			} else {				micount = 0;			}			paint paint = new paint();			paint.setantialias(true);			paint.setcolor(color.black);			canvas.drawrect(0, 0, 320, 480, paint);			switch (micount % 6) {			case 0:				paint.setcolor(color.blue);				break;			case 1:				paint.setcolor(color.green);				break;			case 2:				paint.setcolor(color.red);				break;			case 3:				paint.setcolor(color.yellow);				break;			case 4:				paint.setcolor(color.argb(255, 255, 181, 216));				break;			case 5:				paint.setcolor(color.argb(255, 0, 255, 255));				break;			default:				paint.setcolor(color.white);				break;			}			int i, j;			double x, y, r;			for (i = 0; i <= 90; i++) {				for (j = 0; j <= 90; j++) {					r = math.pi / 45 * i * (1 - math.sin(math.pi / 45 * j))							* 20;					x = r * math.cos(math.pi / 45 * j)							* math.sin(math.pi / 45 * i) + 320 / 2;					y = -r * math.sin(math.pi / 45 * j) + 400 / 4;					canvas.drawpoint((float) x, (float) y, paint);				}			}			paint.settextsize(32);			paint.settypeface(typeface.create(typeface.serif, typeface.italic));			rectf rect = new rectf(60, 400, 260, 405);			canvas.drawroundrect(rect, (float) 1.0, (float) 1.0, paint);			canvas.drawtext("loving you", 75, 400, paint);			msurfaceholder.unlockcanvasandpost(canvas);		} catch (exception e) {		}	}}


关于这个程序要讲解的几点:

1. 画图的时候你可以继承view,也可以继承surfaceview,这两者的区别在于:surfaceview是在一个新起的单独线程中可以重新绘制画面而view必须在ui的主线程中更新画面。surfaceview可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了surfaceholder类,使用getholder方法获取,还有涉及的surfacecreated(surfaceholder holder),surfacedestroyed(surfaceholder holder),surfacechanged(surfaceholder holder, int format, int width, int height)方法,而在surfaceholder.callback 接口回调中可以通过重写来改变这些方法

2.程序其实很简单, 既然生命了runnable接口,就有相对应的run方法,在surfacecreate()的时候开启线程,线程每隔200ms就刷新一次,这样我们看到的效果就是闪烁的,每200毫秒 画一次图,根据经过的间隔时间来设置画笔的颜色,然后通过循环描点,画出心形,然后设置字体大小,画字和字下面的横线。

3.关于心形函数,是从一个例子中看来得,关于x和y的得到,
x = r * math.cos(math.pi / 45 * j)  * math.sin(math.pi / 45 * i) + 320 / 2;  y = -r * math.sin(math.pi / 45 * j) + 400 / 4;
320是屏幕的宽度,本来竖屏我设置的是480,可是下面得写字,就设置为400的了,关于画更好看的心形还有一个函数,大家可以看下:
 
1 楼 walldr2161 2011-08-18  
先留个爪,效果不错,问题是代码排版。。。。
利用俺的酒葫芦先收了,回家了在看,上班中。。。。。。。。。。。。。
2 楼 cheney_love 2011-08-18  
楼主是原作?
3 楼 夜之son 2011-09-29  
实在不敢恭维
  相关解决方案