基本的surfaceView东西 - 学习Android SDK

时间:2012-03-02 10:38:02

标签: android android-activity

有点厚颜无耻 - 但我想知道是否有人能告诉我下面有什么问题。 这是在试图理解android而不是“真正的”代码。

这是一个在主要活动布局中布局的surfaceView。

它有效 - 直到手机的“关闭”按钮被轻敲(睡眠)并再次唤醒。醒来后,它变得疯狂,android产生一个“强制关闭”diaglog。

我一直在尝试使用LogCat跟踪路径,但由于某种原因,某些消息被删除 - 或者 - 我认为正在遵循的路径,不是。

例如 - 关于让手机进入睡眠状态,我会调用surfaceDestroyed(看起来很合理)但是在醒来时,我没有得到一个surfaceCreated()。

基本逻辑是:surfaceView创建一个线程,以秒为单位绘制系统时间作为文本。就是这样。

我有一个我想写的真正的应用程序 - 但在我真正理解基础知识之前,这不会发生。我也经历过相当多的教程。

任何指点最感激地收到:)

干杯

package net.dionic.android.bouncingsquid;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.lang.System;


public class WidgetSeconds extends SurfaceView implements SurfaceHolder.Callback {

private class CanvasThread extends Thread {
    private SurfaceHolder _surfaceHolder;
    private WidgetSeconds _surfaceView;
    private boolean _run = false;

    public CanvasThread(SurfaceHolder surfaceHolder, WidgetSeconds surfaceView) {
        Log.i("WidgetSecs.CanvasThread", "constructor");
        _surfaceHolder = surfaceHolder;
        _surfaceView = surfaceView;
    }

    public void setRunning(boolean run) {
        _run = run;
    }

    @Override
    public void run() {
        Canvas c;
        while (_run) {
            c = null;
            try {
                c = _surfaceHolder.lockCanvas(null);
                synchronized (_surfaceHolder) {
                    _surfaceView.onDraw(c);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) {
                    _surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

private CanvasThread canvasthread;


public void Initalise() {
    Log.i("WidgetSecs", "Initialise");
}

public WidgetSeconds(Context context, AttributeSet attrs) {
    super(context, attrs);
    Log.i("WidgetSecs", "constructor");
    this.Initalise();
    getHolder().addCallback(this);
    setFocusable(true);
}

@Override
public void onDraw(Canvas canvas) {
    Paint textPaint;
    canvas.drawColor(Color.GRAY);
    textPaint = new Paint();
    textPaint.setTextSize(32);
    canvas.drawText(System.currentTimeMillis()/1000 + " S", 10, 50, textPaint);
    canvas.restore();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Log.i("WidgetSecs", "surfaceChanged");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Log.i("WidgetSecs", "surfaceCreated");
    Log.i("WidgetSecs.CanvasThread", "Thread create");
    canvasthread = new CanvasThread(getHolder(), this);
    canvasthread.setRunning(true);
    canvasthread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    Log.i("WidgetSecs", "surfaceDestroyed");
    boolean retry = true;
    while (retry) {
        try {
            Log.i("WidgetSecs", "Thread destroyed");
            canvasthread.join();
            canvasthread = null;
            retry = false;
        } catch (InterruptedException e) {
            Log.i("WidgetSecs", "Thread join failed");
            // we will try it again and again...
        }
    }

}
}

0 个答案:

没有答案