本文實例講述了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程序設計有所幫助。
新聞熱點
疑難解答
圖片精選