Android学习之霓虹灯效果--所遇问题

  新手一枚,在学习Android编程时,受网友推荐,看了疯狂Android讲义一书,在几天的环境配置后,终于开始上手写程序了。

  对于书中的霓虹灯效果一直感觉不错,所以在反复研究后便开始编程。

以下是书中代码:

package com.example.framelayouttest;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	private int currentColor = 0;
	final int[] colors = new int[] { R.color.color1, R.color.color2,
			R.color.color3, R.color.color4, R.color.color5, R.color.color6 };
	final int[] names = new int[] { R.id.view01, R.id.view02, R.id.view03,
			R.id.view04, R.id.view05, R.id.view06 };
	TextView[] views = new TextView[names.length];
	Handler handler = new Handler() {

		public void handlerMessage(Message msg) {
			if (msg.what == 0x123) {
				for (int i = 0; i < names.length; i++) {
					views[i].setBackgroundResource(colors[(i + currentColor)
							% names.length]);
				}
				currentColor=(currentColor+1)%6;
			}
			super.handleMessage(msg);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		for (int i = 0; i < names.length; i++) {
			views[i] = (TextView) findViewById(names[i]);
		}
		new Timer().schedule(new TimerTask() {
			public void run() {
				handler.sendEmptyMessage(0x123);
			}
		}, 0, 200);
	}

	public boolean onCreateOptionsMenu(Menu menu) { 
	  getMenuInflater().inflate(R.menu.main, menu); return true; }
}


在运行时却发现出现了界面的大概效果(没有在正中央,这个问题留待以后研究)。

之后看了网友一的代码:

package com.example.framelayouttaskactivity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class FrameLayoutTaskActivity extends Activity {

	boolean flag = true;
	private int currentColor = 0;
	final int[] colors = new int[] { R.color.color7,R.color.color6,R.color.color5,R.color.color4, R.color.color3,
			R.color.color2, R.color.color1, };

	final int[] names = new int[] { R.id.view1, R.id.view2, R.id.view3,
			R.id.view4, R.id.view5, R.id.view6, R.id.view7 };

	TextView[] views = new TextView[7];

	class MyHandler extends Handler {

		public void handleMessage(Message msg) {
			show();
			sleep((long) 100);
		}
 
		void show() {

			for (int i = 0; i < names.length; i++) {
				views[i].setBackgroundResource(colors[(i + currentColor)
						% names.length]);
			}
			currentColor++;
			if(currentColor>=7){
				currentColor=0;
			}
		}

		public void sleep(Long delayMillis) {
			if (flag){
				this.sendMessageDelayed(this.obtainMessage(0), delayMillis);
			}
		}
	}

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_frame_layout_task);

		for (int i = 0; i < 7; i++) {
			views[i] = (TextView) findViewById(names[i]);
		}

		MyHandler handler = new MyHandler();
		handler.sleep((long) 300);
	}
}

运行效果:


并且是可以动态改变的,因此我反复检查自己的代码,和书中所讲一样,不会有差错。


在百度Timer类时发现,现在Android不提倡使用它,具体请百度。

这是一链接http://www.cnblogs.com/xzf158/archive/2009/09/04/1560042.html

因此断定应该是这里的问题,便修改为如下代码:

package com.example.framelayouttest;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	private int currentColor = 0;
	boolean flag = true;
	final int[] colors = new int[] { R.color.color1, R.color.color2,
			R.color.color3, R.color.color4, R.color.color5, R.color.color6 };
	final int[] names = new int[] { R.id.view01, R.id.view02, R.id.view03,
			R.id.view04, R.id.view05, R.id.view06 };
	TextView[] views = new TextView[names.length];
	class MyHandler extends Handler {

		public void handleMessage(Message msg) {
			show();
			sleep((long) 100);
		}
 
		void show() {

			for (int i = 0; i < names.length; i++) {
				views[i].setBackgroundResource(colors[(i + currentColor)
						% names.length]);
			}
			currentColor++;
			if(currentColor>=7){
				currentColor=0;
			}
		}

		public void sleep(Long delayMillis) {
			if (flag){
				this.sendMessageDelayed(this.obtainMessage(0), delayMillis);
			}
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		for (int i = 0; i < names.length; i++) {
			views[i] = (TextView) findViewById(names[i]);
		}
		MyHandler handler = new MyHandler();
		handler.sleep((long) 300);
	}
}




运行发现果然可以正常改变颜色!而具体的内部原因等我研究透再贴一博详细解释(还要解析为什么界面没在中央的问题)

go!
















你可能感兴趣的:(android,计算机,计算机Android)