直接贴代码:
package com.android.engineer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class DrawCircleView extends SurfaceView implements SurfaceHolder.Callback{
private static final String TAG = "DrawCircleView";
Paint mPaint = null;
Rect[] mCircleRects = new Rect[5] ;
boolean[] hadFill = new boolean[5];
final int RADIUS = 35;
boolean bFirst = true;
Canvas mCanvas = new Canvas();
Point mCurPoint = null;
SurfaceHolder mHolder = null;
private boolean debug = false;
public DrawCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
Log.d(TAG,"DrawCircleView constructor.");
mHolder = getHolder();
mHolder.addCallback(this);
}
private void initPaint(){
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GREEN);
}
//private void setCircleRects(Rect[] rects){
private void setCircleRects(){
int width = getMeasuredWidth();
int height = getMeasuredHeight();
height = height%10==0 ? height : 10*(height/10);
Log.i(TAG, String.format(
"____setCircleRects(...)______measure width: %d, measure height : %d",
width, height));
mCircleRects[0] = new Rect(0,0,RADIUS*2,RADIUS*2);//The upper left corner
mCircleRects[1] = new Rect(width - RADIUS*2,0,width , RADIUS*2); // The upper right corner
mCircleRects[2] = new Rect(0,height - RADIUS*2,RADIUS*2,height); // The lower left corner
mCircleRects[3] = new Rect(width - RADIUS*2 , height - RADIUS*2,width,height);//The lower right corner
mCircleRects[4] = new Rect(width/2 - RADIUS , height/2 - RADIUS, width/2 + RADIUS,height/2 + RADIUS);//center
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN){
int x = (int) event.getX();
int y = (int) event.getY();
final int len = mCircleRects.length;
for(int i=0; i < len ; i++){
// final Point p = mPoint[i];
if(mCircleRects[i].contains(x, y)){
hadFill[i]=true;
drawSolidCircle(i);
}
}
}
return true;
// return super.onTouchEvent(event);
}
private void drawHollowCircle(){
//draw hollow circle
Canvas canvas = mHolder.lockCanvas(null);
mPaint.setStyle(Style.STROKE);
for(Rect r : mCircleRects){
canvas.drawCircle(r.centerX(), r.centerY(), RADIUS, mPaint);
}
mHolder.unlockCanvasAndPost(canvas);
}
private void drawSolidCircle(int index){
Canvas canvas = mHolder.lockCanvas(mCircleRects[index]);
//draw solid circle
Log.i(TAG,"________draw fill circle INDEX: "+ index);
mPaint.setStyle(Style.FILL);
Log.i(TAG,"mCircleRects[0].centerX()= "+ mCircleRects[0].centerX());
Log.i(TAG,"mCircleRects[0].centerY()= "+ mCircleRects[0].centerY());
canvas.drawCircle(mCircleRects[index].centerX(),
mCircleRects[index].centerY(), RADIUS, mPaint);
if(fillAll(hadFill)){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
getContext().sendBroadcast(
new Intent(TouchScreenTest.PRIVATE_ACTION)
.putExtra("TestPass", 1));
}
}, 500);
}
mHolder.unlockCanvasAndPost(canvas);
}
/**
* @param bArray
* @return Return true if all circles had been filled.Or false.
*/
boolean fillAll(boolean[] bArray){
for(boolean b : bArray){
if(!b){
Log.i(TAG, "____fillAll____b :" + b);
return false;
}
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
Log.d(TAG,"surfaceChanged !!");
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.d(TAG,"surfaceCreated !!");
initPaint();
//setCircleRects(mCircleRects);
setCircleRects();
drawHollowCircle();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.d(TAG,"surfaceDestroyed !!");
}
}
</pre><pre code_snippet_id="534351" snippet_file_name="blog_20141127_1_5908392" name="code" class="java">问题应该就属于surfaceview的双缓存机制,不过我真的没搞明白什么意思?
阶段二:
今天又花了两个小时的研究这个代码,为了方便查找问题,把代码做了最简单话的处理,得到如下结论:
drawSolidCircle函数中lockCanvas根本就没有锁住任何区域,整个屏幕我还是可以乱写乱画。