亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲在线免费看| 亚洲精品久久久一区二区三区| 日韩人体视频一二区| 国产综合久久久久| 欧美成人精品h版在线观看| 国产欧美日韩视频| 色综合久久精品亚洲国产| 午夜免费日韩视频| 午夜精品一区二区三区在线视频| 成人免费淫片aa视频免费| 亚洲xxxx3d| 亚洲日韩中文字幕| 久久精品中文字幕一区| 国产精品福利在线观看网址| 精品国产美女在线| 992tv成人免费影院| 亚洲国产精品久久精品怡红院| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久久久久免费| 一区二区三区久久精品| 久久综合久久八八| 最近2019年好看中文字幕视频| 国产一区二区在线免费视频| 日韩不卡在线观看| 最近免费中文字幕视频2019| 国产日韩欧美视频| 91久久夜色精品国产网站| 欧美在线一级va免费观看| 在线看片第一页欧美| 亚洲色图五月天| 98视频在线噜噜噜国产| 精品视频在线导航| 亚洲图片制服诱惑| 亚洲白拍色综合图区| 亚洲精品v欧美精品v日韩精品| 亚洲国内高清视频| 午夜精品一区二区三区在线| 久久精品国产久精国产思思| 亚洲欧美国内爽妇网| 欧美激情视频一区二区三区不卡| 国产美女精品视频免费观看| 乱亲女秽乱长久久久| 人妖精品videosex性欧美| 超碰日本道色综合久久综合| 中文字幕少妇一区二区三区| 欧美日本高清一区| 最近2019中文字幕在线高清| 国产丝袜一区视频在线观看| 国产69精品久久久久9| 亚洲人成电影网站| 欧美精品久久久久久久免费观看| 国产日本欧美一区| 精品久久久久久久久久久久| 久久国产精品电影| 超碰97人人做人人爱少妇| 欧美高清不卡在线| 日韩国产精品一区| 欧美激情国产日韩精品一区18| 亚洲精品福利视频| 欧美精品18videos性欧美| 97碰在线观看| 国产精品三级久久久久久电影| 久久精品亚洲精品| 日韩av在线播放资源| 伊人久久综合97精品| 日韩av在线最新| 精品高清一区二区三区| 亚洲伊人第一页| 日本成人免费在线| 中文字幕一区日韩电影| 美女视频黄免费的亚洲男人天堂| 91久久夜色精品国产网站| 在线精品播放av| 亚洲国内精品在线| 91精品国产自产在线观看永久| 亚洲自拍欧美色图| 亚洲精品国产精品自产a区红杏吧| …久久精品99久久香蕉国产| 欧美国产日韩一区二区三区| 亚洲欧美国产精品久久久久久久| 精品久久久久久中文字幕大豆网| 亚洲肉体裸体xxxx137| 成人午夜在线视频一区| 久久久人成影片一区二区三区| 日日骚av一区| 国产精品免费看久久久香蕉| 欧美美女18p| 亚洲国产精品va在线看黑人动漫| 日韩av综合中文字幕| 亚洲国产精品va在线看黑人动漫| 91黑丝在线观看| 日韩在线播放视频| 亚洲久久久久久久久久久| 久久久久久久久久久成人| 精品五月天久久| 伊人久久五月天| 国产精品1区2区在线观看| 国产日韩欧美自拍| 成人乱人伦精品视频在线观看| 日韩精品在线观看一区二区| 国产成人午夜视频网址| 性色av一区二区三区在线观看| 久久777国产线看观看精品| 亚洲va欧美va国产综合剧情| 亚洲国产一区二区三区在线观看| 欧美日韩国产成人在线观看| 国产精品久久久久久久久久三级| 国产精品高潮呻吟久久av无限| 亚洲美女在线看| 日本精品性网站在线观看| 中文字幕日韩电影| 欧美精品激情在线观看| 亚洲精品v欧美精品v日韩精品| 亚洲一区av在线播放| 97视频在线观看免费高清完整版在线观看| 亚洲аv电影天堂网| 国产在线不卡精品| 国产成人精品一区二区| 国产精品美女午夜av| 欧美韩国理论所午夜片917电影| 国内伊人久久久久久网站视频| 日韩一区二区av| 91精品在线国产| 日韩中文字幕在线免费观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 91极品女神在线| 欧美日韩国产一区二区三区| 久久精品国产成人| 日韩高清电影免费观看完整| 国产精品久久久精品| 91精品国产亚洲| 亚洲欧美激情在线视频| 日本国产欧美一区二区三区| 日本精品久久中文字幕佐佐木| 国产va免费精品高清在线| 日韩av一卡二卡| 亚洲欧洲免费视频| 久久久久国产精品免费| 欧美在线视频导航| 九九九久久国产免费| 亚洲精品久久久久中文字幕二区| 日韩av资源在线播放| 91精品免费久久久久久久久| 欧美激情精品久久久久久| 欧美日韩国产成人| 97视频人免费观看| 狠狠做深爱婷婷久久综合一区| 精品日韩中文字幕| 国产这里只有精品| 精品久久久久久久久久久久久| 综合网日日天干夜夜久久| 久久久久久久久久久国产| 久热精品在线视频| 国产亚洲欧美另类中文| 粉嫩老牛aⅴ一区二区三区| 亚洲欧洲高清在线| 国产欧美日韩中文字幕在线| 91大神在线播放精品| 国产精品久久久久久久久久久久久久| 亚洲第一精品自拍| 国产精品看片资源| 精品久久久久久中文字幕一区奶水| 亚洲综合在线做性| 97超级碰碰碰久久久|