不使用Surface视图的按钮

时间:2012-02-02 09:09:28

标签: android android-layout android-widget surfaceview android-button

我是Android的新用户,我正在尝试使用自定义表面视图添加开始重置按钮。我可以画一个带有触摸移动的圆圈的画布。

现在我的问题是当我点击开始按钮时,圆圈必须占据其初始位置(10,10)。

我的活动课

public class OpenGlActivity extends Activity implements OnClickListener {
    GameView GameView;
    FrameLayout Frame;
    LinearLayout canvas;
    Button btnStart, btnReset;
    TutorialThread GameThread;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set full screen view
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        GameView = new GameView(this);
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStart.setOnClickListener(this);
        btnReset = (Button) findViewById(R.id.btnReset);
        btnReset.setOnClickListener(this);
        GameView.setOnTouchListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnStart:
                Log.i("openGl", "play called");
                GameView.setState();

                // drawView.invalidate();
            break;
            case R.id.btnReset:
                // GameView.play=true;
                // GameView.reset();
                Log.i("openGl", "RESETcalled");
                // drawView.invalidate();
            break;
        }
    }
}

自定义surfaceview类和线程类

class GameView extends SurfaceView implements SurfaceHolder.Callback {
    String TAG = "GameView";
    private TutorialThread _thread;
    Paint paint = new Paint();
    Paint red = new Paint();
    Paint black = new Paint();
    int x = 20;
    int y = 20;

    public GameView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        getHolder().addCallback(this);
        _thread = new TutorialThread(getHolder(), this);
        // TODO Auto-generated constructor stub
        paint.setColor(Color.WHITE);
        paint.setAntiAlias(true);
        red.setColor(Color.RED);
        red.setAntiAlias(true);
        black.setColor(Color.BLACK);
        black.setAntiAlias(true);
        setFocusable(true);
    }

    public GameView(Context context, AttributeSet attrs) {
        super(context, attrs);
        getHolder().addCallback(this);
        _thread = new TutorialThread(getHolder(), this);
        // TODO Auto-generated constructor stub
        paint.setColor(Color.WHITE);
        paint.setAntiAlias(true);
        red.setColor(Color.RED);
        red.setAntiAlias(true);
        black.setColor(Color.BLACK);
        black.setAntiAlias(true);
        setFocusable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        x = (int) event.getX();
        y = (int) event.getY();
        return true;
    }

    public void setState() {
        Log.i(TAG, "in setState");
        _thread.play();
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        canvas.drawCircle(x, y, 10, red);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        _thread.setRunning(true);
        _thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // simply copied from sample application LunarLander:
        // we have to tell thread to shut down & wait for it to finish, or else
        // it might touch the Surface after we return and explode
        boolean retry = true;
        _thread.setRunning(false);
        while (retry) {
            try {
                _thread.join();
                retry = false;
            } catch (InterruptedException e) {
                // we will try it again and again...
            }
        }
    }
}

class TutorialThread extends Thread {
    String TAG = "TutorialThread";
    private SurfaceHolder _surfaceHolder;
    private GameView _panel;
    private boolean _run = false;

    public TutorialThread(SurfaceHolder surfaceHolder, GameView panel) {
        _surfaceHolder = surfaceHolder;
        _panel = panel;
    }

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

    @Override
    public void run() {
        Canvas c;
        while (_run) {
            c = null;
            try {
                c = _surfaceHolder.lockCanvas(null);
                synchronized (_surfaceHolder) {
                    _panel.onDraw(c);
                }
            } 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);
                }
            }
        }
    }

    public void play() {
        synchronized (_surfaceHolder) {
            _panel.x = 10;
            _panel.y = 10;
            Log.i(TAG, "in Play");
        }
    }
}

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <com.example.opengl.GameView
       android:id="@+id/gameView"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"/>
    <LinearLayout 
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
        <Button
             android:id="@+id/btnStart"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Start" />
        <Button
            android:id="@+id/btnReset"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Reset" />
    </LinearLayout>
</FrameLayout>

0 个答案:

没有答案