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

本讲内容: Android中的绘画动画 SurfaceView

SurfaceView是View的一个子类,它提供了一种比普通View组件绘制速度更快的绘图方式,在游戏、视频等要求高帧速和高流畅度的场合,使用SurfaceView成了一种很好的选择。本讲让我们通过一个能发送莫尔斯码的灯塔实例来讲解SurfaceView的使用,请留意代码中的注释。

一、实例:窈窈莫尔斯灯塔

1、创建项目 Lesson25_Morse , 启动Activity名字叫 MainActivity.java

2、创建一个莫尔斯码的工具类 Morse.java

package basic.android.lesson37;

import java.util.HashMap;
import java.util.Map;

public class Morse {

	public static Map standardMorseCharactersMap = new HashMap();

	static {
		standardMorseCharactersMap.put("a", ".-");
		standardMorseCharactersMap.put("b", "-...");
		standardMorseCharactersMap.put("c", "-.-.");
		standardMorseCharactersMap.put("d", "-..");
		standardMorseCharactersMap.put("e", ".");
		standardMorseCharactersMap.put("f", "..-.");
		standardMorseCharactersMap.put("g", "--.");
		standardMorseCharactersMap.put("h", "....");
		standardMorseCharactersMap.put("i", "..");
		standardMorseCharactersMap.put("j", ".---");
		standardMorseCharactersMap.put("k", "-.-");
		standardMorseCharactersMap.put("l", ".-..");
		standardMorseCharactersMap.put("m", "--");
		standardMorseCharactersMap.put("n", "-.");
		standardMorseCharactersMap.put("o", "---");
		standardMorseCharactersMap.put("p", ".--.");
		standardMorseCharactersMap.put("q", "--.-");
		standardMorseCharactersMap.put("r", ".-.");
		standardMorseCharactersMap.put("s", "...");
		standardMorseCharactersMap.put("t", "-");
		standardMorseCharactersMap.put("u", "..-");
		standardMorseCharactersMap.put("v", "...-");
		standardMorseCharactersMap.put("w", ".--");
		standardMorseCharactersMap.put("x", "-..-");
		standardMorseCharactersMap.put("y", "-.--");
		standardMorseCharactersMap.put("z", "--..");

		standardMorseCharactersMap.put("0", "-----");
		standardMorseCharactersMap.put("1", ".----");
		standardMorseCharactersMap.put("2", "..---");
		standardMorseCharactersMap.put("3", "...--");
		standardMorseCharactersMap.put("4", "....-");
		standardMorseCharactersMap.put("5", ".....");
		standardMorseCharactersMap.put("6", "-....");
		standardMorseCharactersMap.put("7", "--...");
		standardMorseCharactersMap.put("8", "---..");
		standardMorseCharactersMap.put("9", "----.");

		standardMorseCharactersMap.put(".", ".-.-.-");
		standardMorseCharactersMap.put("-", "-....-");
		standardMorseCharactersMap.put(",", "--..--");
		standardMorseCharactersMap.put("?", "..--..");
		standardMorseCharactersMap.put("/", "-..-.");
		standardMorseCharactersMap.put(";", "-.-.-.");
		standardMorseCharactersMap.put("(", "-.--.");
		standardMorseCharactersMap.put(")", "-.--.-");
		standardMorseCharactersMap.put("@", ".--.-.");
		standardMorseCharactersMap.put("*", "...-.-");
		standardMorseCharactersMap.put("+", ".-.-.");
		standardMorseCharactersMap.put("%", ".-...");
		standardMorseCharactersMap.put("\\", "---...");
		standardMorseCharactersMap.put("\"", ".-..-.");
		standardMorseCharactersMap.put("'", ".----.");
		standardMorseCharactersMap.put("!", "=---.");
		standardMorseCharactersMap.put("$", "...-..-");
		standardMorseCharactersMap.put(" ", "/");
	}

	public static String morseEncoder(String input) {
		String output = "";
		for (char c : input.toCharArray()) {
			output += standardMorseCharactersMap.get(String.valueOf(c)) + " ";
		}
		return output;
	}

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

}

 

3、布局文件 main.xml 的内容如下:

 

<?xml version="1.0" encoding="utf-8"?>


	
	

	
	

	

	
	

	
		

	

 

4、MainActivity.java的内容如下:

 

package basic.android.lesson37;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

	private LinearLayout layout;

	//莫尔斯码数组变量
	char[] chars;
	//莫尔斯码数组计数变量
	int count = 0;
	//开关标志
	boolean flag = false;
	//循环标志
	boolean loop = false;

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

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

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

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

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

			@Override
			public void onClick(View v) {
				String text = Morse.morseEncoder(et1.getText().toString());
				et2.setText(text);
			}
		});

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

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

	}

	// 信号灯
	class LightView extends SurfaceView {

		//声明 surfaceHolder 对象
		SurfaceHolder holder;

		// 构造方法
		public LightView(Context context) {
			super(context);

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

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

					@Override
					public void run() {

						while (loop) {

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

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

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

								//标志位是真的时候关一下灯
								if(flag){
									sleep(2);
									paint.setColor(Color.BLACK);
								}else{ //为假的时候就亮灯
									// di 亮2个时间点
									if (s.equalsIgnoreCase(".")) {
										sleep(2);
										paint.setColor(Color.YELLOW);
									} else if(s.equalsIgnoreCase("-")) {
										// dah 亮4个时间点
										sleep(4);
										paint.setColor(Color.YELLOW);
									}else if(s.equalsIgnoreCase(" ")){
										// 空格 亮2个时间点
										sleep(2);
										paint.setColor(Color.BLACK);
									}else if(s.equalsIgnoreCase("/")){
										// 单词之间的空白亮2个时间点
										sleep(2);
										paint.setColor(Color.BLACK);
									}else{
										// 出问题的时候亮红灯
										sleep(2);
										paint.setColor(Color.RED);
									}
									count--;
								}
								//绘制灯光
								canvas.drawCircle(250.0f, 200.0f, 100, paint);

								//标准位开关
								flag = !flag;	

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

						}

					}

					//休眠
					public void sleep(int time){
						try {
							Thread.sleep(time*80);
						} catch (Exception e) {
							//no nothing
						}
					}
				}

				@Override
				public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
					// do nothing
				}

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

				@Override
				public void surfaceDestroyed(SurfaceHolder holder) {
					loop = false;
				}
			});

			loop = true;

		}
	}
}

 

5、编译并运行程序,查看结果:

image

好了,本讲就到这里,下次再见。祝福我们家宝宝小yaoyao。

转自 http://android.yaohuiji.com/archives/818

posted on 2011-11-02 11:10  moss  阅读(111)  评论(0)    收藏  举报

导航