android画图的制作,Android画图工具的制作

Android 项目中使用到画图工具,本文记载如何实现,需详细了解cavas和surfaceviw

1 三星pad

三星pad自带的手写笔可以很好的支持画图,集成三星的sdk

5227290.htm

以上三星官方提供的库文件,主要代码如下

private SpenNoteDoc mSpenNoteDoc;

private SpenPageDoc mSpenPageDoc;

private SpenSurfaceView mSpenSurfaceView;

final FrameLayout spenViewLayout = (FrameLayout) mainView.findViewById(R.id.spenViewLayout);

mSpenSurfaceView = new SpenSurfaceView(getActivity());

if (mSpenSurfaceView == null) {

Toast.makeText(getActivity(), "Cannot create new SpenView.", Toast.LENGTH_SHORT).show();

}

spenViewLayout.addView(mSpenSurfaceView,0);

ViewTreeObserver vto = spenViewLayout.getViewTreeObserver();

vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

spenViewLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);

try {

mSpenNoteDoc = new SpenNoteDoc(getActivity(), spenViewLayout.getWidth(), spenViewLayout.getHeight());

} catch (IOException e) {

e.printStackTrace();

}

mSpenPageDoc = mSpenNoteDoc.appendPage();

mSpenPageDoc.setBackgroundColor(0xFFf0f0f0);

mSpenPageDoc.clearHistory();

mSpenSurfaceView.setPageDoc(mSpenPageDoc, true);

mSpenSurfaceView.setBlankColor(getResources().getColor(android.R.color.white));

mSpenSurfaceView.setToolTypeAction(mFINGERToolType, SpenSurfaceView.ACTION_STROKE);

mSpenSurfaceView.setToolTypeAction(mSPENToolType, SpenSurfaceView.ACTION_STROKE);

SpenSettingPenInfo penInfo = new SpenSettingPenInfo();

penInfo.color = Color.RED;

penInfo.size = (int) MyApplication.getAppContext().getResources().getDimension(R.dimen.mBrushSize_red);

mSpenSurfaceView.setPenSettingInfo(penInfo);

}

});

清空区域

mSpenPageDoc = mSpenNoteDoc.appendPage();

mSpenPageDoc.setBackgroundColor(0xFFf0f0f0);

mSpenSurfaceView.setPageDoc(mSpenPageDoc, true);

SpenObjectTextBox.setInitialCursorPos(SpenObjectTextBox.CURSOR_POS_END);

加载图片

mSpenPageDoc.setBackgroundImage(filepath);

mSpenSurfaceView.update();

mSpenNoteDoc.removePage(0);

三星书写流畅,体验很好。

2 自定义画笔

自定义画笔采用封装SurfaceView

http://www.cnblogs.com/xuling/archive/2011/06/06/android.html

这个例子很好的的解释了 surfaceview

public class PainterCanvas extends SurfaceView implements Callback{

public PainterCanvas(Context context, AttributeSet attrs) {

super(context, attrs);

this.mcontext = context;

SurfaceHolder holder = getHolder();

holder.addCallback(this);

setFocusable(true);

Log.e("xx", "PainterCanvas");

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

if (mBitmap == null) {

Log.e("xx", "surfaceChanged1");

mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

bgBitmap = Bitmap.createBitmap(mBitmap);//背景图

bgBitmap.eraseColor(Color.WHITE);

mCanvas = new Canvas(bgBitmap);

getThread().setBitmap(mBitmap, true);

getThread().drawBitmap(bgBitmap,true);

} else {

Log.e("xx", "surfaceChanged2");

getThread().setBitmap(mBitmap, false);

getThread().drawBitmap(bgBitmap,false);

}

public PainterThread getThread() {

if (mThread == null) {

mThread = new PainterThread(getHolder());

}

return mThread;

}    }

public void surfaceCreated(SurfaceHolder holder) {

getThread().on();

getThread().start();

}

public void PaintClean() {

getThread().setBitmap(mBitmap, true);

getThread().drawBitmap(bgBitmap,true);

}

public void surfaceDestroyed(SurfaceHolder holder) {

boolean retry = true;

getThread().off();

while (retry) {

try {

getThread().join();

retry = false;

} catch (InterruptedException e) {

}

}

mThread = null;

}

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

//Log.e("xx", "开始。。。。");

//sb = new StringBuffer();

getThread().drawBegin();

break;

case MotionEvent.ACTION_MOVE:

//Log.e("xx", "进行中。。。。");

getThread().draw((int) event.getX(), (int) event.getY());

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

//Log.e("xx", "结束。。。。");

getThread().drawEnd();

break;

}

return true;

}

public void drawBitmap(Bitmap bitmap) {

Matrix matrix = center(bitmap, true, true);

//Matrix matrix  =new Matrix();

mCanvas.drawBitmap(bitmap, matrix, null);

if (bitmap != null && !bitmap.isRecycled()) {

bitmap.isRecycled();

bitmap = null;

}

//getThread().drawBitmap(bgBitmap,false);

}

}

PainterThread中主要封装了一个mCanvas,在onTouchEvent中调用该cavas实现画笔,

public PainterThread(SurfaceHolder surfaceHolder) {

mHolder = surfaceHolder;

mBrushSize = 5;

mBrush = new Paint();

mBrush.setAntiAlias(true);

mBrush.setColor(Color.RED);

mBrush.setStrokeWidth(mBrushSize);

mBrush.setStrokeCap(Cap.ROUND);

// 重置坐标点

mLastBrushPointX = -1;

mLastBrushPointY = -1;

}

将surfaceHolder作为参数传给PainterCanvas

canvas = mHolder.lockCanvas();

synchronized (mHolder) {

if (canvas != null) {

//if (bgBitmap != null) {

canvas.drawBitmap(bgBitmap, 0, 0, null);

//}

canvas.drawBitmap(mBitmap, 0, 0, null);

}

}

} catch (Exception e) {

e.printStackTrace();

Log.e("paiters", "e.printStackTrace()");

} finally {

if (canvas != null) {

mHolder.unlockCanvasAndPost(canvas);

}

}

canvas绘制完成,PainterCanvas刷新显示。用于在图片上做批注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值