您的位置:首页 > 移动开发 > Android开发

Android中利用画图类和线程画出闪烁的心形

2011-11-16 17:03 375 查看
大家先看图片:



因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:

里面设置两个类,一个是我们的activity类,这个类用来显示示图,然后建一个继承surfaceview的类,我们在这里面画图。先贴两个累的代码:

主类名:iaiaimainactivity,画图类类名:love.

Java代码

package com.iaiai.activity;import android.app.activity;import android.os.bundle;/** * * <p> * title: iaiaiactivity.java * </p> * <p> * e-mail: 176291935@qq.com * </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.app.activity;import android.os.bundle;/** * * <p> * title: iaiaiactivity.java * </p> * <p> * e-mail: 176291935@qq.com * </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); }}

Java代码

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: 176291935@qq.com * </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) { } }}

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: 176291935@qq.com * </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的了,关于画更好看的心形还有一个函数,大家可以看下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: