新手一枚,在学习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!