Java Android动画滞后
请向下滚动到“编辑””:)Java Android动画滞后,java,android,animation,lag,Java,Android,Animation,Lag,请向下滚动到“编辑””:) 我试图了解一些使用android Studio的基本android动画编程,并且我已经在互联网上学习了一些教程。 我已经知道一些基本的java编程,但是我的“复制/粘贴应用”有一个问题 这是我的主要活动: public class MainActivity extends ActionBarActivity { private Button play; @Override protected void onCreate(Bundle savedInstanceSt
我试图了解一些使用android Studio的基本android动画编程,并且我已经在互联网上学习了一些教程。 我已经知道一些基本的java编程,但是我的“复制/粘贴应用”有一个问题 这是我的主要活动:
public class MainActivity extends ActionBarActivity {
private Button play;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play_button);
play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent startGame = new Intent("com.abc.test.DRAWGAME2");
startActivity(startGame);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}}
这是DrawGame2.java:
public class DrawGame2 extends Activity implements View.OnTouchListener {
private MyView surfaceView;
private float y;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
surfaceView = new MyView(this);
surfaceView.setOnTouchListener(this);
setContentView(surfaceView);
}
@Override
protected void onPause() {
super.onPause();
surfaceView.pause();
}
@Override
protected void onResume() {
super.onResume();
surfaceView.resume();
}
@Override
public boolean onTouch(View v, MotionEvent me) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch (me.getAction()){
case MotionEvent.ACTION_DOWN:
y = me.getY();
break;
case MotionEvent.ACTION_UP:
y = me.getY();
break;
case MotionEvent.ACTION_MOVE:
y = me.getY();
break;
}
return true;
}
public class MyView extends SurfaceView implements Runnable {
private Thread thread = null;
private SurfaceHolder holder;
private boolean isRunning = false;
public MyView(Context context) {
super(context);
holder = getHolder();
y = 0;
}
public void run() {
while (isRunning) {
if (!holder.getSurface().isValid()) {
continue;
}
Canvas canvas = holder.lockCanvas();
canvas.drawRGB(02,02,150);
if (y != 0){
Bitmap test = BitmapFactory.decodeResource(getResources(),R.drawable.greenball);
canvas.drawBitmap(test, canvas.getWidth()/2 - test.getWidth()/2, y, null);
}
holder.unlockCanvasAndPost(canvas);
}
}
public void pause() {
isRunning = false;
while (true) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
thread = null;
}
public void resume() {
isRunning = true;
thread = new Thread(this);
thread.start();
}
}}
日志:
02-12 11:01:06.676 1972-1972/com.abc.test I/art﹕ Not late-enabling -Xcheck:jni (already on)
02-12 11:01:06.881 1972-1990/com.abc.test D/OpenGLRenderer﹕ Render dirty regions requested: true
02-12 11:01:06.882 1972-1972/com.abc.test D/﹕ HostConnection::get() New Host Connection established 0xa686fb60, tid 1972
02-12 11:01:06.917 1972-1972/com.abc.test D/Atlas﹕ Validating map...
02-12 11:01:07.007 1972-1990/com.abc.test D/﹕ HostConnection::get() New Host Connection established 0xa686fd90, tid 1990
02-12 11:01:07.037 1972-1990/com.abc.test I/OpenGLRenderer﹕ Initialized EGL, version 1.4
02-12 11:01:07.102 1972-1990/com.abc.test D/OpenGLRenderer﹕ Enabling debug mode 0
02-12 11:01:07.126 1972-1990/com.abc.test W/EGL_emulation﹕ eglSurfaceAttrib not implemented
02-12 11:01:07.126 1972-1990/com.abc.test W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6814940, error=EGL_SUCCESS
02-12 11:01:07.705 1972-1990/com.abc.test W/EGL_emulation﹕ eglSurfaceAttrib not implemented
02-12 11:01:07.705 1972-1990/com.abc.test W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6814940, error=EGL_SUCCESS
02-12 11:01:12.571 1972-1990/com.abc.test W/EGL_emulation﹕ eglSurfaceAttrib not implemented
02-12 11:01:12.571 1972-1990/com.abc.test W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5a69ba0, error=EGL_SUCCESS
02-12 11:01:16.892 1972-1972/com.abc.test I/Choreographer﹕ Skipped 263 frames! The application may be doing too much work on its main thread.
02-12 11:01:16.899 1972-2270/com.abc.test D/﹕ HostConnection::get() New Host Connection established 0xa5dfcc10, tid 2270
这个应用程序的问题是,动画真的很滞后,我不明白为什么!
我试着用一个简单的矩形制作同样的动画,但是仍然存在滞后
问题不在于OnTouchListener,因为我尝试在run方法中的每个循环中将y值增加1(同时禁用OnTouchListener),但它仍然滞后
我用不同的模拟器(棒棒糖、Kitkat)和我的三星Galaxy S3(果冻豆)进行了尝试
有没有聪明人能帮我解决这个问题
祝你今天愉快
编辑: 好的,我应用了我得到的答案,现在它在我的Samung Galaxy S3上平稳运行 不过,我的模拟器上仍然存在滞后现象。我已经安装了HAXM,模拟器在我创建的应用程序中运行得很顺利,但只要我启动应用程序并按下“播放”按钮,当我与应用程序交互时,动画就会延迟 这是我的模拟器的属性:
Name: Nexus_5_API_21
CPU/ABI: Intel Atom (x86)
hw.gpu.enabled: yes
Path: C:\Users\User\.android\avd\Nexus_5_API_21.avd
Target: Android 5.0.1 (API level 21)
Skin: nexus_5
SD Card: 100M
Snapshot: no
hw.lcd.density: 480
hw.dPad: no
avd.ini.encoding: UTF-8
hw.camera.back: none
disk.dataPartition.size: 200M
runtime.network.latency: none
skin.dynamic: no
hw.keyboard: yes
runtime.network.speed: full
hw.device.hash2: MD5:2fa0e16c8cceb7d385183284107c0c88
hw.ramSize: 1536
tag.id: default
tag.display: Default
hw.sdCard: yes
hw.device.manufacturer: Google
hw.mainKeys: no
hw.accelerometer: yes
hw.trackBall: no
hw.device.name: Nexus 5
hw.sensors.proximity: yes
hw.battery: yes
AvdId: Nexus_5_API_21
hw.sensors.orientation: yes
hw.audioInput: yes
hw.camera.front: none
hw.gps: yes
avd.ini.displayname: Nexus 5 API 21
snapshot.present: no
vm.heapSize: 64
runtime.scalefactor: auto
据我所知,您的问题在于
onTouch()
方法,在该方法中,您有以下代码:
try{
Thread.sleep(50);
}catch (InterruptedException e){
e.printStackTrace();
}
这将使主线程休眠,这意味着所有操作都将使整个应用程序保持50毫秒
所以试着删除它。解码资源对性能也不友好。您应该更早地解码位图,并在绘图时重用它。为什么不使用onDraw方法?我认为此解决方案解决了主要问题,但我的模拟器仍然存在滞后现象。我以前已经尝试过这个解决方案,但由于它在模拟器上仍然落后,我认为这不是问题所在,因此从未将.apk上传到我的SGS3。我在我的第一篇帖子中添加了更多关于这个问题的信息。谢谢!:)@Misklahr只是想知道,为什么你一开始就把代码放在那里?好吧,我只是跟着一个视频教程(几乎是复制/粘贴)开始学习。但奇怪的是,对于视频中的人来说,它并没有滞后:)