下面列出了android.view.SurfaceHolder#lockCanvas ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private synchronized void drawFrame() {
final SurfaceHolder holder = getSurfaceHolder();
if (holder != null && holder.getSurface().isValid()) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
// Draw on the Canvas!
}
} finally {
if (canvas != null && holder != null)
holder.unlockCanvasAndPost(canvas);
}
// Schedule the next frame
handler.removeCallbacks(drawSurface);
}
handler.postDelayed(drawSurface, 1000 / FPS);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
if (DOLOG)
Log.d(TAG, "onSurfaceChanged: width = [" + width + "], height = [" + height + "]");
display = new Display(BlockDropWallpaper.this);
if (height > width) {
scale = (float) width / (float) height;
yCenter = height / 2f;
} else {
scale = 0.8f;
yCenter = (height / scale) / (2f * scale);
}
xCenter = width / 2f;
if (getState() != STATE_PAUSED) {
// Manually redraw with the new dimensions (it won't redraw automatically when paused)
Canvas canvas = holder.lockCanvas();
draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
private void draw(SurfaceHolder holder) {
if (holder == null || !holder.getSurface().isValid())
return;
Canvas canvas;
try {
canvas = holder.lockCanvas();
if (canvas == null) return;
} catch (Exception e) {
return;
}
canvas.drawColor(Color.BLACK);
background.draw(canvas, particleSpeed);
holder.unlockCanvasAndPost(canvas);
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 10);
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
if (circles.size() >= maxNumber) {
circles.clear();
}
int x = (int) (width * Math.random());
int y = (int) (height * Math.random());
circles.add(new MyPoint(String.valueOf(circles.size() + 1),
x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
if (visible) {
handler.postDelayed(drawRunner, 5000);
}
}
@SuppressLint("WrongCall")
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas(null);
synchronized (holder) {
onDraw(canvas);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
/**
* Draw function doing the context locking and rendering
*/
private void draw() {
if(mDrawer == null) return;
// Ask the drawer if wants to draw in this frame
if(mDrawer.shouldDraw()) {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
// Lock the drawing canvas
c = holder.lockCanvas();
if (c != null) {
// Let the drawer render to the canvas
mDrawer.draw(c);
}
} finally {
if (c != null) holder.unlockCanvasAndPost(c);
}
}
mHandler.removeCallbacks(mUpdateDisplay);
if (mVisible) {
// Wait one frame, and redraw
mHandler.postDelayed(mUpdateDisplay, 33);
}
}
private void invalidSurfaceView() {
Canvas canvas = null;
SurfaceHolder surfaceHolder = getHolder();
try {
canvas = surfaceHolder.lockCanvas(null);
if (canvas != null) {
draw(canvas);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
draw(canvas);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
if (visible) {
handler.postDelayed(drawRunner, 200);
}
}
@Override
public void onTouchEvent(MotionEvent event) {
if (touchEnabled) {
float x = event.getX();
float y = event.getY();
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.BLACK);
circles.clear();
circles.add(new MyPoint(
String.valueOf(circles.size() + 1), x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
super.onTouchEvent(event);
}
}
@Override
public void run() {
try {
while (!stopped.get()) {
if (!queue.isEmpty() || firstDraw.get()) {
SurfaceHolder holder = getHolder();
if (holder != null) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
synchronized(holder) {
doDraw(canvas);
}
} finally {
if (canvas != null) holder.unlockCanvasAndPost(canvas);
}
}
} else {
synchronized(this) {
wait(100L);
}
}
}
} catch(Exception e) {
Log.e(LOG_TAG, "Exception in ViewThread.run()", e);
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
isSurfaceCreated = true;
Canvas canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
DrawHelper.clearCanvas(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
/**
* 画控件
*/
private void drawView() {
synchronized (mSync) {
Canvas canvas = null;
SurfaceHolder holder = null;
try {
holder = getHolder();
if (holder == null || !holder.getSurface().isValid()) return;
//获得canvas对象
canvas = holder.lockCanvas();
if (canvas == null) return;
//清除画布上面里面的内容
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
//绘制画布内容
drawContent(canvas);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (holder != null && canvas != null) {
//释放canvas锁,并且显示视图
try {
holder.unlockCanvasAndPost(canvas);
} catch (IllegalArgumentException e2) {
e2.printStackTrace();
}
}
}
}
}
/**
* 画控件
*/
private void drawView() {
synchronized (mSync) {
Canvas canvas = null;
SurfaceHolder holder = null;
try {
holder = getHolder();
if (holder == null || !holder.getSurface().isValid()) return;
//获得canvas对象
canvas = holder.lockCanvas();
if (canvas == null) return;
//清除画布上面里面的内容
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
//绘制画布内容
drawContent(canvas);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (holder != null && canvas != null) {
//释放canvas锁,并且显示视图
try {
holder.unlockCanvasAndPost(canvas);
} catch (IllegalArgumentException e2) {
e2.printStackTrace();
}
}
}
}
}
public void surfaceCreated(SurfaceHolder surfaceHolder) {
this.isSurfaceCreated = true;
Canvas canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
DrawHelper.clearCanvas(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
private void drawSurfaceView(SurfaceHolder holder) {
if (this.mNextBitmap != null && !this.mNextBitmap.isRecycled()) {
Canvas localCanvas = holder.lockCanvas();
if (localCanvas != null) {
Rect rect = new Rect();
rect.left = rect.top = 0;
rect.bottom = localCanvas.getHeight();
rect.right = localCanvas.getWidth();
localCanvas.drawBitmap(this.mNextBitmap, null, rect, this.mPaint);
holder.unlockCanvasAndPost(localCanvas);
}
}
}
private void draw(SurfaceHolder holder) {
this.mDrawRequested = false;
Canvas canvas = holder.lockCanvas();
if (canvas == null) {
return;
}
try {
onDraw(canvas, holder.getSurfaceFrame());
} finally {
holder.unlockCanvasAndPost(canvas);
}
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
// redrawEverything means that the whole screen is dirty, reset all params and redraw everything
if (redrawEverything) {
initDimensParam(width, height);
canvas = holder.lockCanvas();
} else {
canvas = holder.lockCanvas(textRect);
}
if (canvas != null) {
draw(canvas);
}
} finally {
if (canvas != null) {
try {
holder.unlockCanvasAndPost(canvas);
} catch (Exception ignore) {
}
}
}
if (visible) {
doFrame();
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
isSurfaceCreated = true;
Canvas canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
DrawHelper.clearCanvas(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
@Override
public void invalidate() {
super.invalidate();
final SurfaceHolder holder = mHolder;
if (holder == null) {
return;
}
final Canvas canvas = holder.lockCanvas();
if (canvas == null) {
return;
}
// Clear the canvas.
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
if (getVisibility() != View.VISIBLE) {
holder.unlockCanvasAndPost(canvas);
return;
}
final int width = getWidth();
final int height = getHeight();
// Draw the pretty gradient background.
mGradientBackground.setBounds(0, 0, width, height);
mGradientBackground.draw(canvas);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
paint.setTextAlign(Align.CENTER);
paint.setTextSize(mContext.getResources().getDimensionPixelSize(
R.dimen.search_text_font_size));
canvas.drawText(
mContext.getString(R.string.search_dialog_label, mQueryText),
width / 2.0f,
height / 2.0f,
paint);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas();
draw(c);
holder.unlockCanvasAndPost(c);
}