大家先看图片:

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

Java代码

  1. 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代码

  1. 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 &lt;= 90; i++) {              for (j = 0; j &lt;= 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;/** * * &lt;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 &lt; 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 &lt;= 90; i++) { for (j = 0; j &lt;= 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的了,关于画更好看的心形还有一个函数,大家可以看下: