Базовый материал SurfaceView - изучение Android SDK - PullRequest
1 голос
/ 02 марта 2012

Это немного нахально - но мне было интересно, если кто-нибудь может сказать мне, что не так внизу.Это возиться с попыткой понять Android - не «реальный» код.

Это поверхностный вид, который выложен в основном макете активности.

Работает - до тех пор, пока кнопка телефона не выключитсяпрослушивается (спит) и снова просыпается.Проснувшись, он сходит с ума, и Android выдает диаграмму "Force Close".

Я пытался следовать по пути с 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...
        }
    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...