Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android动画滞后_Java_Android_Animation_Lag - Fatal编程技术网

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只是想知道,为什么你一开始就把代码放在那里?好吧,我只是跟着一个视频教程(几乎是复制/粘贴)开始学习。但奇怪的是,对于视频中的人来说,它并没有滞后:)