首页 > 系统 > Android > 正文

Android编程实现在Bitmap上涂鸦效果

2020-04-11 11:14:18
字体:
来源:转载
供稿:网友

本文实例讲述了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表