登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 826678|回复: 128

第二十五讲:Android动画入门(二)

  [复制链接]

58

主题

58

帖子

130

安币

程序猿

Rank: 2

发表于 2011-4-24 21:07:36 | 显示全部楼层 |阅读模式
本讲内容: Android中的绘画动画 SurfaceView
SurfaceView是View的一个子类,它提供了一种比普通View组件绘制速度更快的绘图方式,在游戏、视频等要求高帧速和高流畅度的场合,使用SurfaceView成了一种很好的选择。本讲让我们通过一个能发送莫尔斯码的灯塔实例来讲解SurfaceView的使用,请留意代码中的注释。
一、实例:窈窈莫尔斯灯塔
1、创建项目 Lesson25_Morse , 启动Activity名字叫 MainActivity.java
2、创建一个莫尔斯码的工具类 Morse.java
  1. package basic.android.lesson37;

  2. import java.util.HashMap;
  3. import java.util.Map;

  4. public class Morse {

  5.         public static Map<string ,="" string=""> standardMorseCharactersMap = new HashMap</string><string ,="" string="">();

  6.         static {
  7.                 standardMorseCharactersMap.put("a", ".-");
  8.                 standardMorseCharactersMap.put("b", "-...");
  9.                 standardMorseCharactersMap.put("c", "-.-.");
  10.                 standardMorseCharactersMap.put("d", "-..");
  11.                 standardMorseCharactersMap.put("e", ".");
  12.                 standardMorseCharactersMap.put("f", "..-.");
  13.                 standardMorseCharactersMap.put("g", "--.");
  14.                 standardMorseCharactersMap.put("h", "....");
  15.                 standardMorseCharactersMap.put("i", "..");
  16.                 standardMorseCharactersMap.put("j", ".---");
  17.                 standardMorseCharactersMap.put("k", "-.-");
  18.                 standardMorseCharactersMap.put("l", ".-..");
  19.                 standardMorseCharactersMap.put("m", "--");
  20.                 standardMorseCharactersMap.put("n", "-.");
  21.                 standardMorseCharactersMap.put("o", "---");
  22.                 standardMorseCharactersMap.put("p", ".--.");
  23.                 standardMorseCharactersMap.put("q", "--.-");
  24.                 standardMorseCharactersMap.put("r", ".-.");
  25.                 standardMorseCharactersMap.put("s", "...");
  26.                 standardMorseCharactersMap.put("t", "-");
  27.                 standardMorseCharactersMap.put("u", "..-");
  28.                 standardMorseCharactersMap.put("v", "...-");
  29.                 standardMorseCharactersMap.put("w", ".--");
  30.                 standardMorseCharactersMap.put("x", "-..-");
  31.                 standardMorseCharactersMap.put("y", "-.--");
  32.                 standardMorseCharactersMap.put("z", "--..");

  33.                 standardMorseCharactersMap.put("0", "-----");
  34.                 standardMorseCharactersMap.put("1", ".----");
  35.                 standardMorseCharactersMap.put("2", "..---");
  36.                 standardMorseCharactersMap.put("3", "...--");
  37.                 standardMorseCharactersMap.put("4", "....-");
  38.                 standardMorseCharactersMap.put("5", ".....");
  39.                 standardMorseCharactersMap.put("6", "-....");
  40.                 standardMorseCharactersMap.put("7", "--...");
  41.                 standardMorseCharactersMap.put("8", "---..");
  42.                 standardMorseCharactersMap.put("9", "----.");

  43.                 standardMorseCharactersMap.put(".", ".-.-.-");
  44.                 standardMorseCharactersMap.put("-", "-....-");
  45.                 standardMorseCharactersMap.put(",", "--..--");
  46.                 standardMorseCharactersMap.put("?", "..--..");
  47.                 standardMorseCharactersMap.put("/", "-..-.");
  48.                 standardMorseCharactersMap.put(";", "-.-.-.");
  49.                 standardMorseCharactersMap.put("(", "-.--.");
  50.                 standardMorseCharactersMap.put(")", "-.--.-");
  51.                 standardMorseCharactersMap.put("@", ".--.-.");
  52.                 standardMorseCharactersMap.put("*", "...-.-");
  53.                 standardMorseCharactersMap.put("+", ".-.-.");
  54.                 standardMorseCharactersMap.put("%", ".-...");
  55.                 standardMorseCharactersMap.put("\\", "---...");
  56.                 standardMorseCharactersMap.put("\"", ".-..-.");
  57.                 standardMorseCharactersMap.put("'", ".----.");
  58.                 standardMorseCharactersMap.put("!", "=---.");
  59.                 standardMorseCharactersMap.put("$", "...-..-");
  60.                 standardMorseCharactersMap.put(" ", "/");
  61.         }

  62.         public static String morseEncoder(String input) {
  63.                 String output = "";
  64.                 for (char c : input.toCharArray()) {
  65.                         output += standardMorseCharactersMap.get(String.valueOf(c)) + " ";
  66.                 }
  67.                 return output;
  68.         }

  69.         public static void main(String[] args) {
  70.                 String input = "yao mu yang";
  71.                 String output = Morse.morseEncoder(input);
  72.                 System.out.println(output);
  73.         }

  74. }</string>
复制代码
3、布局文件 main.xml 的内容如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout01">

  3.         <textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TextView01" android:text="输入:">
  4.         </textview>

  5.         <edittext android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/EditText01" android:text="">
  6.         </edittext>

  7.         <button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="转换">
  8.         </button>

  9.         <textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/TextView02" android:text="输出:">
  10.         </textview>

  11.         <edittext android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/EditText02" android:text="" android:editable="false">
  12.         </edittext>       

  13.         <button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button02" android:text="发送信号">
  14.         </button>
  15. </linearlayout>
复制代码
4、MainActivity.java的内容如下:
  1. package basic.android.lesson37;

  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.SurfaceHolder;
  10. import android.view.SurfaceView;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.LinearLayout;

  15. public class MainActivity extends Activity {

  16.         private LinearLayout layout;

  17.         //莫尔斯码数组变量
  18.         char[] chars;
  19.         //莫尔斯码数组计数变量
  20.         int count = 0;
  21.         //开关标志
  22.         boolean flag = false;
  23.         //循环标志
  24.         boolean loop = false;

  25.         @Override
  26.         public void onCreate(Bundle savedInstanceState) {
  27.                 super.onCreate(savedInstanceState);
  28.                 setContentView(R.layout.main);

  29.                 // 定义UI组件
  30.                 final Button b1 = (Button) findViewById(R.id.Button01);
  31.                 final Button b2 = (Button) findViewById(R.id.Button02);

  32.                 final EditText et1 = (EditText) findViewById(R.id.EditText01);
  33.                 final EditText et2 = (EditText) findViewById(R.id.EditText02);

  34.                 layout = (LinearLayout) findViewById(R.id.LinearLayout01);

  35.                 // 单击转换按钮,转换莫尔斯码
  36.                 b1.setOnClickListener(new View.OnClickListener() {

  37.                         @Override
  38.                         public void onClick(View v) {
  39.                                 String text = Morse.morseEncoder(et1.getText().toString());
  40.                                 et2.setText(text);
  41.                         }
  42.                 });

  43.                 // 单击发送信号按钮,把莫尔斯码用灯信号的方式发送出去
  44.                 b2.setOnClickListener(new View.OnClickListener() {

  45.                         @Override
  46.                         public void onClick(View v) {
  47.                                 //当morse码文本框中有内容的时候就发送灯信号
  48.                                 if (et2.getText() != null && et2.getText().toString().length() > 0) {
  49.                                         //把莫尔斯码拆解成一个一个字符
  50.                                         chars = et2.getText().toString().toCharArray();
  51.                                         //计数
  52.                                         count = chars.length;
  53.                                         //创建SurfaceView
  54.                                         LightView light = new LightView(MainActivity.this);
  55.                                         //把SurfaceView动态加入Activity
  56.                                         layout.addView(light);
  57.                                 }
  58.                         }
  59.                 });

  60.         }

  61.         // 信号灯
  62.         class LightView extends SurfaceView {

  63.                 //声明 surfaceHolder 对象
  64.                 SurfaceHolder holder;

  65.                 // 构造方法
  66.                 public LightView(Context context) {
  67.                         super(context);

  68.                         // 从 SurfaceView 中获取 SurfaceHolder对象
  69.                         holder = this.getHolder();
  70.                         // addCallback 对象
  71.                         holder.addCallback(new SurfaceHolder.Callback() { //创建SurfaceHolder.Callback匿名内部类

  72.                                 //在SurfaceHolder.Callback内部类的内部创建它所需要的线程内部类
  73.                                 class LightThread implements Runnable {

  74.                                         @Override
  75.                                         public void run() {

  76.                                                 while (loop) {

  77.                                                         if (count > 0) {
  78.                                                                 Log.i("yao", "" + count);
  79.                                                                 String s = String.valueOf(chars[chars.length - count]);
  80.                                                                 // 锁定canvas,开始绘图
  81.                                                                 Canvas canvas = holder.lockCanvas(null);

  82.                                                                 Paint paint = new Paint();
  83.                                                                 paint.setAntiAlias(true);

  84.                                                                 //清屏幕
  85.                                                                 paint.setColor(Color.BLACK);
  86.                                                                 canvas.drawRect(0, 0, 480, 480, paint);                                                                                                                

  87.                                                                 //标志位是真的时候关一下灯
  88.                                                                 if(flag){
  89.                                                                         sleep(2);
  90.                                                                         paint.setColor(Color.BLACK);
  91.                                                                 }else{ //为假的时候就亮灯
  92.                                                                         // di 亮2个时间点
  93.                                                                         if (s.equalsIgnoreCase(".")) {
  94.                                                                                 sleep(2);
  95.                                                                                 paint.setColor(Color.YELLOW);
  96.                                                                         } else if(s.equalsIgnoreCase("-")) {
  97.                                                                                 // dah 亮4个时间点
  98.                                                                                 sleep(4);
  99.                                                                                 paint.setColor(Color.YELLOW);
  100.                                                                         }else if(s.equalsIgnoreCase(" ")){
  101.                                                                                 // 空格 亮2个时间点
  102.                                                                                 sleep(2);
  103.                                                                                 paint.setColor(Color.BLACK);
  104.                                                                         }else if(s.equalsIgnoreCase("/")){
  105.                                                                                 // 单词之间的空白亮2个时间点
  106.                                                                                 sleep(2);
  107.                                                                                 paint.setColor(Color.BLACK);
  108.                                                                         }else{
  109.                                                                                 // 出问题的时候亮红灯
  110.                                                                                 sleep(2);
  111.                                                                                 paint.setColor(Color.RED);
  112.                                                                         }
  113.                                                                         count--;
  114.                                                                 }
  115.                                                                 //绘制灯光
  116.                                                                 canvas.drawCircle(250.0f, 200.0f, 100, paint);

  117.                                                                 //标准位开关
  118.                                                                 flag = !flag;       

  119.                                                                 // 释放canvas,绘图完毕
  120.                                                                 holder.unlockCanvasAndPost(canvas);
  121.                                                         }

  122.                                                 }

  123.                                         }

  124.                                         //休眠
  125.                                         public void sleep(int time){
  126.                                                 try {
  127.                                                         Thread.sleep(time*80);
  128.                                                 } catch (Exception e) {
  129.                                                         //no nothing
  130.                                                 }
  131.                                         }
  132.                                 }

  133.                                 @Override
  134.                                 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  135.                                         // do nothing
  136.                                 }

  137.                                 @Override
  138.                                 public void surfaceCreated(SurfaceHolder holder) {
  139.                                         //在SurfaceView被创建的时候执行
  140.                                         new Thread(new LightThread()).start();
  141.                                 }

  142.                                 @Override
  143.                                 public void surfaceDestroyed(SurfaceHolder holder) {
  144.                                         loop = false;
  145.                                 }
  146.                         });

  147.                         loop = true;

  148.                 }
  149.         }
  150. }
复制代码
5、编译并运行程序,查看结果:
好了,本讲就到这里,下次再见。祝福我们家宝宝小yaoyao。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0

主题

2

帖子

0

安币

初级码农

Rank: 1

发表于 2014-5-28 11:36:20 | 显示全部楼层
表示代码真心有问题, 不过还是支持下 , 先了解大概东西,再自己深入研究吧。

1

主题

182

帖子

73

安币

程序猿

Rank: 2

发表于 2011-9-21 16:16:56 | 显示全部楼层
好文章, 继续学习

点评

不错  发表于 2014-2-9 12:40

0

主题

47

帖子

35

安币

程序猿

Rank: 2

发表于 2011-10-24 23:25:42 | 显示全部楼层
好文章, 继续学习

0

主题

46

帖子

109

安币

程序猿

Rank: 2

QQ达人

发表于 2011-12-16 13:12:42 | 显示全部楼层
赚豆豆呀。

0

主题

46

帖子

109

安币

程序猿

Rank: 2

QQ达人

发表于 2011-12-16 13:13:04 | 显示全部楼层
赚豆豆呀。

0

主题

5

帖子

23

安币

初级码农

Rank: 1

QQ达人

发表于 2012-2-17 12:07:51 | 显示全部楼层
赚豆豆呀。

0

主题

29

帖子

4

安币

初级码农

Rank: 1

QQ达人

发表于 2012-2-25 13:52:25 | 显示全部楼层
没豆豆ile~~~

0

主题

83

帖子

206

安币

攻城狮

Rank: 3Rank: 3

发表于 2012-2-29 16:29:32 | 显示全部楼层
谢谢分享!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

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