SurfaceView画图onDraw方法空指针异常

my_shadow_l 2016-08-08 02:35:43
package com.hengshu.graffiti.view;

import java.util.ArrayList;
import java.util.Iterator;

import android.R.integer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class AnnotationView extends SurfaceView implements
SurfaceHolder.Callback {

private SurfaceHolder surfaceHolder;

// private SurfaceView surfaceView;

private Paint mPaint;
private Path mPath;
private Paint mBitmapPaint;
private Canvas mCanvas;
private Bitmap mBitmap;

private int mLastX;
private int mLastY;

private static ArrayList<DrawPath> savePath;

public DrawPath dp;

public static int penChange;

final private int blackPen = 1;
final private int redPen = 2;
final private int bluePen = 3;
final private int highlighterPen = 4;
final private int eraserPen = 5;

public AnnotationView(Context context) {
super(context);
surfaceHolder = this.getHolder();// 获取holder
surfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);
savePath = new ArrayList<DrawPath>();
initCanvas();
}

public AnnotationView(Context context, AttributeSet attrs) {
super(context, attrs);
surfaceHolder = this.getHolder();// 获取holder
surfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);
savePath = new ArrayList<DrawPath>();
initCanvas();
}

public AnnotationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
surfaceHolder = this.getHolder();// 获取holder
surfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);
savePath = new ArrayList<DrawPath>();
initCanvas();
}

private void init() {
mPaint = new Paint(); // 初始化画笔
mPaint.setColor(Color.BLACK);
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND); // 结合处为圆角
mPaint.setStrokeCap(Paint.Cap.ROUND); // 设置转弯处为圆角
mPaint.setStrokeWidth(3); // 设置画笔宽度
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

public void initCanvas() {
init();
mBitmap = Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap); // 所有mCanvas画的东西都被保存在了mBitmap中

mCanvas.drawColor(Color.TRANSPARENT);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}

protected void onDrawq(Canvas canvas) {
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
if (mPath != null) {
canvas.drawPath(mPath, mPaint);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();

switch (action) {
case MotionEvent.ACTION_DOWN:
mPath = new Path();
dp = new DrawPath();
dp.path = mPath;
dp.paint = mPaint;
mPath.reset();// 清空path
mLastX = x;
mLastY = y;
mPath.moveTo(mLastX, mLastY);

switch (penChange) {
case blackPen:
init();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
mPaint.setAlpha(255);
break;
case redPen:
init();
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(4);
mPaint.setAlpha(255);
break;
case bluePen:
init();
mPaint.setColor(Color.BLUE);
mPaint.setStrokeWidth(4);
mPaint.setAlpha(255);
break;
case highlighterPen:
init();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(20);
mPaint.setAlpha(100);
break;
case eraserPen:

break;

default:
break;
}

repaint();
break;
case MotionEvent.ACTION_MOVE:
int dx = Math.abs(x - mLastX);
int dy = Math.abs(y - mLastY);
if (dx > 1 || dy > 1) {
mPath.quadTo(mLastX, mLastY, (x + mLastX) / 2, (y + mLastY) / 2);
mLastX = x;
mLastY = y;
repaint();
}
break;
case MotionEvent.ACTION_UP:
mPath.lineTo(mLastX, mLastY);
mCanvas.drawPath(mPath, mPaint);
savePath.add(dp);

mPath = null;
repaint();
break;
}

return true;
}

// 实时刷新
@SuppressLint("WrongCall")
public void repaint() {
Canvas c = null;
try {
c = surfaceHolder.lockCanvas();
onDrawq(c);
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}

public void paintChange(int colorFlag) {
switch (colorFlag) {
case 1:
// 黑笔
mPaint.setColor(Color.BLACK);
break;
case 2:
// 红笔
mPaint.setColor(Color.RED);
break;
case 3:
// 蓝笔
mPaint.setColor(Color.BLUE);
break;
case 4:
// 荧光笔
mPaint.setColor(Color.GREEN);
mPaint.setAlpha(100);
break;
case 5:
// 橡皮擦

break;

default:
break;
}
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO 自动生成的方法存根
}

@Override
public void surfaceCreated(SurfaceHolder arg0) {

}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO 自动生成的方法存根

}

public void unDo() {

if (savePath != null && savePath.size() > 0) {
DrawPath drawPath = savePath.get(savePath.size() - 1);
savePath.remove(savePath.size() - 1);
initCanvas();
Iterator<DrawPath> iter = savePath.iterator();
while (iter.hasNext()) {
DrawPath dPath = iter.next();
mCanvas.drawPath(dPath.path, dPath.paint);
}
repaint();
}
}

public void removeAllPaint() {
initCanvas();
repaint();
savePath.clear();
}

public class DrawPath {
Path path;
Paint paint;
}

}


求指点谜经
...全文
155 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧