本文实例讲述了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" > <Buttonandroid: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;}@Overrideprotected 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;}@Overridepublic 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; @Overridepublic 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;@Overridepublic 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程序设计有所帮助。