国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴川市| 金堂县| 长顺县| 蛟河市| 金川县| 射阳县| 大厂| 莲花县| 云龙县| 兰坪| 海门市| 章丘市| 龙海市| 萍乡市| 广宗县| 华亭县| 洛浦县| 深水埗区| 外汇| 柳江县| 霍邱县| 葵青区| 上思县| 涿鹿县| 三门峡市| 娄烦县| 河南省| 大港区| 贵溪市| 舟曲县| 泌阳县| 虞城县| 申扎县| 合川市| 奉节县| 桂东县| 长子县| 玉林市| 玛曲县| 铁岭市| 比如县|