Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 952|回复: 0

[实例教程]Android中利用画图类和线程画出闪烁的心形,送

[复制链接]

该用户从未签到

发表于 2011-10-22 13:35:24 | 显示全部楼层 |阅读模式
本文讲解主要涉及的知识点:
1.线程控制
2.画图类
3.心形函数
大家先看图片:

因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲解代码:
里面设置两个类,一个是我们的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);

     }

}




画图类:
1   /**

2    *  

3    */

4   package com.cz.game.demo;

5   

6   import android.content.Context;

7   import android.graphics.Canvas;

8   import android.graphics.Color;

9   import android.graphics.Paint;

10  import android.graphics.RectF;

11  import android.graphics.Typeface;

12  import android.view.SurfaceHolder;

13  import android.view.SurfaceView;

14  

15  /**

16   * @author CZ

17   *  

18   */

19  public class Love extends SurfaceView implements SurfaceHolder.Callback,

20          Runnable {

21  

22      boolean mbloop = false;

23      SurfaceHolder mSurfaceHolder = null;

24      private Canvas canvas;

25      int miCount = 0;

26      int y = 50;

27  

28      /**

29       * @param context

30       */

31      public Love(Context context) {

32          super(context);

33          mSurfaceHolder = this.getHolder();

34          mSurfaceHolder.addCallback(this);

35          this.setFocusable(true);

36          this.setKeepScreenOn(true);

37          mbloop = true;

38      }

39  

40      /*

41       * (non-javadoc)

42       *  

43       * @see

44       * android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder

45       * , int, int, int)

46       */

47      @Override

48      public void surfaceChanged(SurfaceHolder holder, int format, int width,

49              int height) {

50          // TODO Auto-generated method stub

51  

52      }

53  

54      /*

55       * (non-Javadoc)

56       *  

57       * @see

58       * android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder

59       * )

60       */

61      @Override

62      public void surfaceCreated(SurfaceHolder holder) {

63          // TODO Auto-generated method stub

64          new Thread(this).start();

65      }

66  

67      /*

68       * (non-Javadoc)

69       *  

70       * @seeandroid.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.

71       * SurfaceHolder)

72       */

73      @Override

74      public void surfaceDestroyed(SurfaceHolder holder) {

75          // TODO Auto-generated method stub

76          mbloop = false;

77      }

78  

79      /*

80       * (non-Javadoc)

81       *  

82       * @see java.lang.Runnable#run()

83       */

84      @Override

85      public void run() {

86          // TODO Auto-generated method stub

87          while (mbloop) {

88              try {

89                  Thread.sleep(200);

90              } catch (Exception e) {

91                  // TODO: handle exception

92              }

93              synchronized (mSurfaceHolder) {

94                  Draw();

95              }

96          }

97      }

98  

99      /**

100      *  

101      * Year:2011 Date:2011-7-27 Time:下午06:52:04 Author:CZ TODO

102      */

103     private void Draw() {

104         // TODO Auto-generated method stub

105         canvas = mSurfaceHolder.lockCanvas();

106         try {

107             if (mSurfaceHolder == null || canvas == null) {

108                 return;

109             }

110             if (miCount < 100) {

111                 miCount++;

112             } else {

113                 miCount = 0;

114             }

115             Paint paint = new Paint();

116             paint.setAntiAlias(true);

117             paint.setColor(Color.BLACK);

118             canvas.drawRect(0, 0, 320, 480, paint);

119             switch (miCount % 6) {

120             case 0:

121                 paint.setColor(Color.BLUE);

122                 break;

123             case 1:

124                 paint.setColor(Color.GREEN);

125                 break;

126             case 2:

127                 paint.setColor(Color.RED);

128                 break;

129             case 3:

130                 paint.setColor(Color.YELLOW);

131                 break;

132             case 4:

133                 paint.setColor(Color.argb(255, 255, 181, 216));

134                 break;

135             case 5:

136                 paint.setColor(Color.argb(255, 0, 255, 255));

137                 break;

138             default:

139                 paint.setColor(Color.WHITE);

140                 break;

141             }

142             int i, j;

143             double x, y, r;

144

145             for (i = 0; i <= 90; i++) {

146                 for (j = 0; j <= 90; j++) {

147                     r = Math.PI / 45 * i * (1 - Math.sin(Math.PI / 45 * j))

148                             * 20;

149                     x = r * Math.cos(Math.PI / 45 * j)

150                             * Math.sin(Math.PI / 45 * i) + 320 / 2;

151                     y = -r * Math.sin(Math.PI / 45 * j) + 400 / 4;

152                     canvas.drawPoint((float) x, (float) y, paint);

153                 }

154             }

155

156             paint.setTextSize(32);

157             paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC));

158

159             RectF rect = new RectF(60, 400, 260, 405);

160             canvas.drawRoundRect(rect, (float) 1.0, (float) 1.0, paint);

161             canvas.drawText("Loving You", 75, 400, paint);

162             mSurfaceHolder.unlockCanvasAndPost(canvas);

163         } catch (Exception e) {

164         }

165

166     }

167

168 }

169




关于这个程序要讲解的几点:
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的了,关于画更好看的心形还有一个函数,大家可以看下:


有兴趣的童鞋可以设置再做一下.
关于这个代码就这么多,所以就不放附件代码了,把apk放上,之前就打算写这一篇博客,没想到在七夕这天写了。有兴趣的童鞋可以把apk下载下来给女友看哦…


xin.rar (17.7 KB, 下载次数: 114)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:35:34 | 显示全部楼层
顶一个,不错
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2011-10-22 13:35:43 | 显示全部楼层
不错!!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:01 | 显示全部楼层
apk在哪里啊
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:08 | 显示全部楼层
收藏了!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:13 | 显示全部楼层
感谢王子的分享!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:19 | 显示全部楼层
好牛B...
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:29 | 显示全部楼层
先顶一个
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:34 | 显示全部楼层
代码好复杂哦,老大
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:36:44 | 显示全部楼层
好东西!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-19 04:09 , Processed in 0.396405 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表