Android编程实现在Bitmap上涂鸦效果
程序员文章站
2023-12-16 18:39:52
本文实例讲述了android编程实现在bitmap上涂鸦效果。分享给大家供大家参考,具体如下:
布局文件:
本文实例讲述了android编程实现在bitmap上涂鸦效果。分享给大家供大家参考,具体如下:
布局文件:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <linearlayout android:id="@+id/handwriteview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <linearlayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:gravity="center_horizontal" > <button android:id="@+id/clear" android:layout_width="200dp" android:layout_height="wrap_content" android:text="清屏" /> </linearlayout> </linearlayout>
重写的view文件:
public class handwrite extends view { private paint paint = null; private bitmap originalbitmap = null; private bitmap new1bitmap = null; private bitmap new2bitmap = null; private float clickx = 0,clicky = 0; private float startx = 0,starty = 0; private boolean ismove = true; private boolean isclear = false; private int color = color.green; private float strokewidth = 2.0f; public handwrite(context context,bitmap b) { super(context); originalbitmap = bitmap.createbitmap(b).copy(bitmap.config.argb_8888, true); new1bitmap = bitmap.createbitmap(originalbitmap); } public void clear(){ isclear = true; new2bitmap = bitmap.createbitmap(originalbitmap); invalidate(); } public void setstyle(float strokewidth){ this.strokewidth = strokewidth; } @override protected void ondraw(canvas canvas) { super.ondraw(canvas); canvas.drawbitmap(handwriting(new1bitmap), 0, 0,null); } public bitmap handwriting(bitmap originalbitmap) { canvas canvas = null; if(isclear){ canvas = new canvas(new2bitmap); } else{ canvas = new canvas(originalbitmap); } paint = new paint(); paint.setstyle(style.stroke); paint.setantialias(true); paint.setcolor(color); paint.setstrokewidth(strokewidth); if(ismove){ canvas.drawline(startx, starty, clickx, clicky, paint); } startx = clickx; starty = clicky; if(isclear){ return new2bitmap; } return originalbitmap; } @override public boolean ontouchevent(motionevent event) { clickx = event.getx(); clicky = event.gety(); if(event.getaction() == motionevent.action_down){ ismove = false; invalidate(); return true; } else if(event.getaction() == motionevent.action_move){ ismove = true; invalidate(); return true; } return super.ontouchevent(event); } }
activity文件:
public class handwritingactivity extends activity { /** called when the activity is first created. */ private linearlayout handwrite = null; private button clear = null; int requestwidth=116; int requestheight=173; int insamplesize; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_hand_writing); handwrite = (linearlayout)findviewbyid(r.id.handwriteview); clear = (button)findviewbyid(r.id.clear); clear.setonclicklistener(new clearlistener()); } private class clearlistener implements onclicklistener{ public void onclick(view v) { // handwrite.clear(); bitmapfactory.options opts = new options(); opts.injustdecodebounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息 bitmapfactory.decoderesource(getresources(), r.drawable.cool, opts); if (opts.outheight > requestheight || opts.outwidth > requestwidth) { if (opts.outwidth > opts.outheight) { insamplesize = math.round((float) opts.outheight / (float) requestheight); } else { insamplesize = math.round((float) opts.outwidth / (float) requestwidth); } } system.out.println("宽度:" + opts.outwidth); system.out.println("高度:" + opts.outheight); opts.insamplesize = insamplesize; system.out.println(insamplesize); opts.injustdecodebounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图 // 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流 bitmap b = bitmapfactory.decoderesource(getresources(), r.drawable.cool, opts); handwrite hw = new handwrite(handwritingactivity.this, b); system.out.println(b.getwidth()); handwrite.addview(hw); } } }
整合的一个涂鸦工具类:
/** * 使用方法: * 1. 创建tuyaview类实例 * 2. 调用drawtuya方法 * 3. 参数1:context * 4. 参数2:图像的byte[]字节数组 * 5. imageview实例 * 6. 画笔定义 * **/ import com.ziipin.lhdc.utils.toastutil; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.matrix; import android.graphics.paint; import android.graphics.bitmapfactory.options; import android.view.motionevent; import android.view.view; import android.view.view.ontouchlistener; import android.widget.imageview; public class tuyaview { // 原始图片 private bitmap morignbitmap; private bitmap meditbitmap; private int insamplesize; private int requestwidth = 500; private int requestheight = 700; /** 编辑图片的画布 */ private canvas mcanvas; private imageview image; private paint mpaint; public bitmap drawtuya(context context, byte[] _data, imageview image, paint mpaint) { this.image = image; this.mpaint = mpaint; morignbitmap = bitmapfactory.decodebytearray(_data, 0, _data.length); return showeditbitmap(context, _data, image); } /** * 显示编辑的图片 */ private bitmap showeditbitmap(context context, byte[] _data, imageview image) { morignbitmap = getscalebitmap(_data, image); if (morignbitmap == null) { toastutil.show(context, "编辑出错"); } meditbitmap = morignbitmap.copy(morignbitmap.getconfig(), true); mcanvas = new canvas(meditbitmap); mcanvas.drawbitmap(morignbitmap, new matrix(), new paint()); image.setimagebitmap(meditbitmap); image.setontouchlistener(mtouchlistener); return meditbitmap; } /** * 获取结果缩放放后的图片 * * @return */ private bitmap getscalebitmap(byte[] _data, imageview image) { bitmapfactory.options opts = new options(); opts.injustdecodebounds = true;// 让 bimapfactory假的解析这个位图,只获取位图的边框信息 bitmapfactory.decodebytearray(_data, 0, _data.length, opts); if (opts.outheight > requestheight || opts.outwidth > requestwidth) { if (opts.outwidth > opts.outheight) { insamplesize = math.round((float) opts.outheight / (float) requestheight); } else { insamplesize = math.round((float) opts.outwidth / (float) requestwidth); } } opts.insamplesize = insamplesize; opts.injustdecodebounds = false;// 由于已经得到了缩放比例 ,让位图工厂真正的解析这个位图 // 由于前面 我们已经解析了这个输入流, 需要重新初始化这个输入流 bitmap bmp = bitmapfactory .decodebytearray(_data, 0, _data.length, opts); return bmp; } // touch事件 private ontouchlistener mtouchlistener = new ontouchlistener() { int startx = 0; int starty = 0; @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { case motionevent.action_down:// 手指第一次触摸屏幕 startx = (int) event.getx(); starty = (int) event.gety(); break; case motionevent.action_move: // 手指在imageview上中移动 int x = (int) event.getx(); int y = (int) event.gety(); mcanvas.drawline(startx, starty, x, y, mpaint); startx = (int) event.getx(); starty = (int) event.gety(); image.invalidate(); break; } return true; } }; }
希望本文所述对大家android程序设计有所帮助。