public class StreamSave extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new StreamSaveView(this));
}
}
class StreamSaveView extends SurfaceView implements Callback,Runnable{
private SurfaceHolder mSurfaceHolder;
private Thread mThread;
private boolean mFlag;
private Paint mPaint;
private Canvas mCanvas;
private int mCurrentIndex;
private int mScreenW;
private int mScreenH;
public StreamSaveView(Context context) {
super(context);
mSurfaceHolder=this.getHolder();
mSurfaceHolder.addCallback(this);
mPaint=new Paint();
mPaint.setAntiAlias(true);
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mScreenW=this.getWidth();
mScreenH=this.getHeight();
mFlag=true;
mThread=new Thread(this,"My Thread");
mThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mFlag=false;
}
@Override
public void run() {
while(mFlag){
long start=System.currentTimeMillis();
myDraw();
logic();
long end=System.currentTimeMillis();
if((end-start)<50){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private void logic() {
// TODO Auto-generated method stub
}
private void myDraw() {
try {
mCanvas=mSurfaceHolder.lockCanvas();
if(mCanvas != null){
mCanvas.drawColor(Color.WHITE);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
int tileW=mScreenW/3;
int tileH=mScreenH/3;
//Draw style box
for (int indexX = 0; indexX < 3; indexX++) {
for (int indexY = 0; indexY < 3; indexY++) {
mCanvas.drawRect(indexX*tileW,indexY*tileH,(indexX+1)*tileW,(indexY+1)*tileH,mPaint);
}
}
//Draw ball
mPaint.setStyle(Paint.Style.FILL);
mCanvas.drawCircle(mCurrentIndex%3*tileW+tileW/2, mCurrentIndex/3*tileH+tileH/2, 30, mPaint);
}
} catch (Exception e) {
// TODO: handle exception
}finally{
if(mCanvas != null){
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_LEFT:
if(mCurrentIndex>0){
mCurrentIndex--;
}else
mCurrentIndex=0;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if(mCurrentIndex<9){
mCurrentIndex++;
}else{
mCurrentIndex=8;
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
if(mCurrentIndex<=5){
mCurrentIndex+=3;
}
break;
case KeyEvent.KEYCODE_DPAD_UP:
if(mCurrentIndex>=3){
mCurrentIndex-=3;
}
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
}
问题一:
这是用绘画的方式实现九宫格,刚开始唯一比较难以理解的就是:mCanvas.drawCircle(mCurrentIndex%3*tileW+tileW/2, mCurrentIndex/3*tileH+tileH/2, 30, mPaint);
其实想想之前学习数据结构的时候,求行号是除以每一行的元素的个数,求列号是对一行的元素的个数取模,也就分别对应了y坐标和x坐标