代码如下,还望高手指点。package com.animation;import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsoluteLayout;
import android.widget.AbsoluteLayout.LayoutParams;
import android.widget.ImageView;public class MainActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏。
//动画加载和控制类的实例。
ma = new Ma(this);
//绝对布局实例。
ablt = ma.ablt;
setContentView(ablt);
//启动新线程。
mt = new MinorThread(this);
new Thread(mt).start();
//为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
while(true){
if(mt.getmHandler()==null) continue;
else{
Message msg = new Message();
mt.getmHandler().sendMessage(msg);
break;
}
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//控制动画显示位置。
ma.control();
//发信息给新线程。
Message msg1 = new Message();
mt.getmHandler().sendMessage(msg1);
}
};
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
//按返回键结束程序。
switch(keyCode){
case KeyEvent.KEYCODE_BACK:
System.exit(0);
}
return true;
}
private MinorThread mt = null;
private ImageView v1 = null;
private Ma ma = null;
private int x = 0;
private int y = 0;
private int width = 0;
private int height = 0;
private AbsoluteLayout ablt = null;
}class MinorThread implements Runnable{@Override
public void run() {
//为子线程初始化一个handler。
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
//发信息给主线程。
Message msg2 = new Message();
mainActivity.handler.sendMessage(msg2);
//延时3000毫秒。
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Looper.loop();
}
public MinorThread(MainActivity mainAcitivy){
this.mainActivity = mainAcitivy;
}
private MainActivity mainActivity = null;
private Handler mHandler = null;
public Handler getmHandler() {
return mHandler;
}
}class Ma{
public Ma(MainActivity context){
this.context = context;
ablt = new AbsoluteLayout(context);
TestView v = new TestView(context);
//向绝对布局对象中加入对象v做背景。
AbsoluteLayout.LayoutParams lp = new LayoutParams(480,320,0,0);
ablt.addView(v, lp);
//创建两个动画。
Drawable d = null;
for(int i=0;i<2;i++){
ad = new AnimationDrawable();
d = context.getResources().getDrawable(R.drawable.a1);
ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a2);
ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a3);
ad.addFrame(d, 100);
ad.setOneShot(false);
v1 = new ImageView(context);
v1.setImageDrawable(ad);
//给动画设定一个标签,便于从绝对布局对象中精确查找。
String tag = "test"+i;
v1.setTag(tag);
//设定动画的位置。
ablt.addView(v1, new LayoutParams(100, 40, 20, i*20));
}
}
boolean A = false;
int count = 0;
public void control(){
if(!A){ //若是第一次运行control(),则显示第一个动画,否则显示第二个动画。
//问题就出在这里了,第一个动画不能正常切换图片,第二个却可以。
//当有多个动画时,也是第一次要显示的动画不能切换图片,而第一次之后调用显示的动画却可以。
A = true;
//显示第一个动画。
for(count = 0;count<1;count++){
//从绝对布局对象中找到第一个动画所在的ImageView对象。
v1 = (ImageView) ablt.findViewWithTag("test"+count); //若动画没有完全超出屏幕,则继续移动动画。
if(x<480&&y<320){
System.out.println(x+":"+y);
x+=10;
y+=5;
v1.layout(x, y, x+100, y+40);
AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
ad.start();
}
} }else{
for(count = 1;count<2;count++){
v1 = (ImageView) ablt.findViewWithTag("test"+count); if(x<480&&y<320){
System.out.println(x+":"+y);
x+=10;
y+=5;
v1.layout(x, y, x+100, y+40);
AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
ad.start();
}
}
} } private MainActivity context;
public AbsoluteLayout ablt = null;
private AnimationDrawable ad = null;
private ImageView v1 = null;
private int x = 0;
private int y = 0;
private int width = 0;
private int height = 0;
}class TestView extends View{ public TestView(Context context) {
super(context);
}
@Override
public void onDraw(Canvas canvas){
//显示一个白色的背景。
paint.setColor(Color.WHITE);
canvas.drawRect(0,0,480,320, paint);
}
private Paint paint = new Paint();
}
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsoluteLayout;
import android.widget.AbsoluteLayout.LayoutParams;
import android.widget.ImageView;public class MainActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏。
//动画加载和控制类的实例。
ma = new Ma(this);
//绝对布局实例。
ablt = ma.ablt;
setContentView(ablt);
//启动新线程。
mt = new MinorThread(this);
new Thread(mt).start();
//为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
while(true){
if(mt.getmHandler()==null) continue;
else{
Message msg = new Message();
mt.getmHandler().sendMessage(msg);
break;
}
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//控制动画显示位置。
ma.control();
//发信息给新线程。
Message msg1 = new Message();
mt.getmHandler().sendMessage(msg1);
}
};
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
//按返回键结束程序。
switch(keyCode){
case KeyEvent.KEYCODE_BACK:
System.exit(0);
}
return true;
}
private MinorThread mt = null;
private ImageView v1 = null;
private Ma ma = null;
private int x = 0;
private int y = 0;
private int width = 0;
private int height = 0;
private AbsoluteLayout ablt = null;
}class MinorThread implements Runnable{@Override
public void run() {
//为子线程初始化一个handler。
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
//发信息给主线程。
Message msg2 = new Message();
mainActivity.handler.sendMessage(msg2);
//延时3000毫秒。
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Looper.loop();
}
public MinorThread(MainActivity mainAcitivy){
this.mainActivity = mainAcitivy;
}
private MainActivity mainActivity = null;
private Handler mHandler = null;
public Handler getmHandler() {
return mHandler;
}
}class Ma{
public Ma(MainActivity context){
this.context = context;
ablt = new AbsoluteLayout(context);
TestView v = new TestView(context);
//向绝对布局对象中加入对象v做背景。
AbsoluteLayout.LayoutParams lp = new LayoutParams(480,320,0,0);
ablt.addView(v, lp);
//创建两个动画。
Drawable d = null;
for(int i=0;i<2;i++){
ad = new AnimationDrawable();
d = context.getResources().getDrawable(R.drawable.a1);
ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a2);
ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a3);
ad.addFrame(d, 100);
ad.setOneShot(false);
v1 = new ImageView(context);
v1.setImageDrawable(ad);
//给动画设定一个标签,便于从绝对布局对象中精确查找。
String tag = "test"+i;
v1.setTag(tag);
//设定动画的位置。
ablt.addView(v1, new LayoutParams(100, 40, 20, i*20));
}
}
boolean A = false;
int count = 0;
public void control(){
if(!A){ //若是第一次运行control(),则显示第一个动画,否则显示第二个动画。
//问题就出在这里了,第一个动画不能正常切换图片,第二个却可以。
//当有多个动画时,也是第一次要显示的动画不能切换图片,而第一次之后调用显示的动画却可以。
A = true;
//显示第一个动画。
for(count = 0;count<1;count++){
//从绝对布局对象中找到第一个动画所在的ImageView对象。
v1 = (ImageView) ablt.findViewWithTag("test"+count); //若动画没有完全超出屏幕,则继续移动动画。
if(x<480&&y<320){
System.out.println(x+":"+y);
x+=10;
y+=5;
v1.layout(x, y, x+100, y+40);
AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
ad.start();
}
} }else{
for(count = 1;count<2;count++){
v1 = (ImageView) ablt.findViewWithTag("test"+count); if(x<480&&y<320){
System.out.println(x+":"+y);
x+=10;
y+=5;
v1.layout(x, y, x+100, y+40);
AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
ad.start();
}
}
} } private MainActivity context;
public AbsoluteLayout ablt = null;
private AnimationDrawable ad = null;
private ImageView v1 = null;
private int x = 0;
private int y = 0;
private int width = 0;
private int height = 0;
}class TestView extends View{ public TestView(Context context) {
super(context);
}
@Override
public void onDraw(Canvas canvas){
//显示一个白色的背景。
paint.setColor(Color.WHITE);
canvas.drawRect(0,0,480,320, paint);
}
private Paint paint = new Paint();
}
解决方案 »
- adb push是不是不支持中文名称的资源啊
- Android NDK开发用的SO库是用什么语言写的?
- 请教高手关于Bitmap的copy()问题
- Intents.Scan.RESULT是干吗的
- 求高手推荐几本Android开发的经典教材
- android与web服务器怎样用xml进行数据的交互
- Chronometer计时器如何指定计时开始时间?
- adb logcat命令行如何查看某个进程的log信息? (已知进程的ID 和 有APK应用的源码)
- Android Studio 还是API 要入门的选择?
- git
- 大家注意过android的充电动画吗?
- google partner setup.apk,急救,,,谢谢
while(true){
if(mt.getmHandler()==null) continue;
else{
mt.getmHandler().sendEmptyMessageDelayed(0, 100); break;
}
}
fontlose,谢谢你能这么快来这里帮助我。你说的这个办法不能让第一个动画动起来,希望你能把代码运行一下试一试,看是不是其他问题。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏。
//动画加载和控制类的实例。
ma = new Ma(this);
//绝对布局实例。
ablt = ma.ablt;
setContentView(ablt);
//启动新线程。
mt = new MinorThread(this);
new Thread(mt).start();
//为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
while(true){
if(mt.getmHandler()==null) continue;
else{
// Message msg = new Message();
mt.getmHandler().sendEmptyMessageDelayed(0, 100);
break;
}
}
}
这涉及到的是Android的什么问题?
fontlose,在吗?谁知道这个问题的本质原因?