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


本文讲解主要涉及的知识点:

1.线程控制 
2.画图类 
3.心形函数

大家先看图片:

1.jpg

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

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

主类名:GameMainActivity,画图类类名:Love.


  package com.cz.game.demo; 
  
  import android.app.Activity; 
  import android.os.Bundle; 
  
  public class GameMainActivity extends Activity { 
      /** Called when the activity is first created. */ 
  
      private Love love; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         this.love = new Love(this); 
         setContentView(love); 
     } 
 } 




画图类:

   /** 
    *  
    */ 
   package com.cz.game.demo; 
   
   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; 
  
  /** 
   * @author CZ 
   *  
   */ 
  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(); 
              } 
          } 
      } 
  
      /** 
      *  
      * Year:2011 Date:2011-7-27 Time:下午06:52:04 Author:CZ TODO 
      */ 
     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.jpg

有兴趣的童鞋可以设置再做一下.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值