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

首頁 > 系統 > Android > 正文

Android編程實現手繪及保存為圖片的方法(附demo源碼下載)

2020-04-11 11:10:03
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現手繪及保存為圖片的方法。分享給大家供大家參考,具體如下:

運行效果圖預覽:

應 yzuo_08 要求做了此Demo,跟以前那個手寫板Demo不同的是可以將畫布的內容保存為圖片。

附上關鍵代碼:

MainView.java

package com.tszy.views; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class MainView extends View {  private Paint paint;  private Canvas cacheCanvas;  private Bitmap cachebBitmap;  private Path path;  private int clr_bg, clr_fg;  public MainView(Context context, AttributeSet attrs) {   super(context, attrs);   clr_bg = Color.WHITE;   clr_fg = Color.CYAN;   paint = new Paint();   paint.setAntiAlias(true); // 抗鋸齒   paint.setStrokeWidth(3); // 線條寬度   paint.setStyle(Paint.Style.STROKE); // 畫輪廓   paint.setColor(clr_fg); // 顏色   path = new Path();   // 創建一張屏幕大小的位圖,作為緩沖   cachebBitmap = Bitmap.createBitmap(480, 800, Config.ARGB_8888);   cacheCanvas = new Canvas(cachebBitmap);   cacheCanvas.drawColor(clr_bg);  }  public MainView(Context context) {   super(context);  }  @Override  protected void onDraw(Canvas canvas) {   canvas.drawColor(clr_bg);   // 繪制上一次的,否則不連貫   canvas.drawBitmap(cachebBitmap, 0, 0, null);   canvas.drawPath(path, paint); }  /**   * 清空畫布   */  public void clear() {   path.reset();   cacheCanvas.drawColor(clr_bg);   invalidate();  }  /**   * 將畫布的內容保存到文件   * @param filename   * @throws FileNotFoundException   */  public void saveToFile(String filename) throws FileNotFoundException {   File f = new File(filename);   if(f.exists())    throw new RuntimeException("文件:" + filename + " 已存在!");   FileOutputStream fos = new FileOutputStream(new File(filename));   //將 bitmap 壓縮成其他格式的圖片數據   cachebBitmap.compress(CompressFormat.PNG, 50, fos);   try {    fos.close();   } catch (IOException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  private float cur_x, cur_y;  private boolean isMoving;  @Override  public boolean onTouchEvent(MotionEvent event) {   // TODO Auto-generated method stub   float x = event.getX();   float y = event.getY();   switch (event.getAction()) {    case MotionEvent.ACTION_DOWN : {     cur_x = x;     cur_y = y;     path.moveTo(cur_x, cur_y);     isMoving = true;     break;    }    case MotionEvent.ACTION_MOVE : {     if (!isMoving)      break;     // 二次曲線方式繪制     path.quadTo(cur_x, cur_y, x, y);     // 下面這個方法貌似跟上面一樣     // path.lineTo(x, y);     cur_x = x;     cur_y = y;     break;    }    case MotionEvent.ACTION_UP : {     // 鼠標彈起保存最后狀態     cacheCanvas.drawPath(path, paint);     path.reset();     isMoving = false;     break;    }   }   // 通知刷新界面   invalidate();   return true;  } }

Activity 代碼:

@Override public void onClick(View v) {   // TODO Auto-generated method stub   switch (v.getId()) {    case R.id.iv_btn_clear :     view.clear();     break;    case R.id.iv_btn_save : {     try {      String sdState = Environment.getExternalStorageState(); // 判斷sd卡是否存在      // 檢查SD卡是否可用      if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {       Toast.makeText(this, "SD卡未準備好!", Toast.LENGTH_SHORT).show();       break;      }      //獲取系統圖片存儲路徑      File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);      // Make sure the Pictures directory exists.      path.mkdirs();      //根據當前時間生成圖片名稱      Calendar c = Calendar.getInstance();      String name = ""        + c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH)        + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND)         + ".png";      //合成完整路徑,注意 / 分隔符      String string = path.getPath() + "/" + name;      view.saveToFile(string);      Toast.makeText(this, "保存成功!/n文件保存在:" + string, Toast.LENGTH_LONG).show();     } catch (FileNotFoundException e) {      Toast.makeText(this, "保存失敗!/n" + e, Toast.LENGTH_LONG).show();     }     break;    }   } }

沒什么難度,主要是將Bitmap轉PNG圖片那里,找了一會發現 Canvas 沒有直接或間接保存的方法,剛好這里我使用了雙緩沖,另一塊畫布的內容位圖自己創建的,很自然想到將這個畫布的位圖保存為文件即可。

再查看 Bitmap 有個 compress(CompressFormat format, int quality,OutputStream stream) 方法,很明顯將文件輸出流傳給這個方法就OK

@Override public void onClick(View v) {   // TODO Auto-generated method stub   switch (v.getId()) {    case R.id.iv_btn_clear :     view.clear();     break;    case R.id.iv_btn_save : {     try {      String sdState = Environment.getExternalStorageState(); // 判斷sd卡是否存在      // 檢查SD卡是否可用      if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {      Toast.makeText(this, "SD卡未準備好!", Toast.LENGTH_SHORT).show();       break;      }      //獲取系統圖片存儲路徑      File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);      // Make sure the Pictures directory exists.      path.mkdirs();      //根據當前時間生成圖片名稱      Calendar c = Calendar.getInstance();      String name = ""        + c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH)        + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND)         + ".png";      //合成完整路徑,注意 / 分隔符      String string = path.getPath() + "/" + name;      view.saveToFile(string);      Toast.makeText(this, "保存成功!/n文件保存在:" + string, Toast.LENGTH_LONG).show();     } catch (FileNotFoundException e) {      Toast.makeText(this, "保存失敗!/n" + e, Toast.LENGTH_LONG).show();     }     break;    }   } }

完整實例代碼點擊此處本站下載。

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线中文视频| 91欧美精品成人综合在线观看| 国产欧美亚洲精品| 中文字幕亚洲欧美一区二区三区| 亚洲高清一二三区| 国产国语刺激对白av不卡| 国产精品夜间视频香蕉| 日韩大片在线观看视频| 国产精品久久久久久久午夜| 久久中文字幕国产| 粗暴蹂躏中文一区二区三区| 大伊人狠狠躁夜夜躁av一区| 久久亚洲私人国产精品va| 日韩视频亚洲视频| 日韩一区视频在线| 国产成人免费av| 黄色一区二区在线观看| 亚洲国产一区二区三区在线观看| 亚洲高清免费观看高清完整版| 亚洲免费视频一区二区| 美日韩精品免费视频| 欧美成人免费全部观看天天性色| 欧美大片在线看| 亚洲色在线视频| 国内精品久久久久影院优| 97在线视频免费播放| 欧美日韩综合视频| 久久手机精品视频| 欧美色videos| 欧美激情综合色综合啪啪五月| 久久亚洲国产成人| 国产亚洲一区二区在线| 欧美人与性动交a欧美精品| 欧美在线视频播放| 欧美性猛交xxxx免费看| 麻豆一区二区在线观看| 久久久欧美一区二区| 欧美激情网站在线观看| 成人福利网站在线观看11| 日韩在线欧美在线国产在线| 亚洲一区二区三区在线免费观看| 欧美日韩免费区域视频在线观看| 欧美片一区二区三区| 国产精品亚洲一区二区三区| 亚洲一区二区三| 日韩激情片免费| 久久伊人91精品综合网站| 欧美极品在线视频| 亚洲色图35p| 98精品国产高清在线xxxx天堂| 91青草视频久久| 亚洲综合精品一区二区| 亚洲精品网站在线播放gif| 亚洲男人天堂古典| 青青青国产精品一区二区| 欧美中文字幕第一页| 国产ts一区二区| 精品国内自产拍在线观看| 久久视频在线视频| 亚洲第一精品夜夜躁人人爽| 日韩电影免费观看中文字幕| 国产精品免费一区二区三区都可以| 欧美在线亚洲一区| 中文字幕亚洲欧美日韩高清| 奇米4444一区二区三区| 日韩av在线网| 欧美亚洲激情视频| 亚洲综合色av| 亚洲国产精品999| 日韩中文字幕在线看| 欧美一区二区三区艳史| 亚洲在线免费看| 青青久久av北条麻妃黑人| 国产精品一二三在线| 亚洲欧美国产日韩天堂区| 亚洲free嫩bbb| 欧美性少妇18aaaa视频| 日韩美女在线观看一区| 成人欧美一区二区三区黑人| 色偷偷综合社区| 久久天天躁夜夜躁狠狠躁2022| 久久免费在线观看| 国产精品人成电影| 国产精品日韩久久久久| 成人精品一区二区三区| 日韩经典一区二区三区| 亚洲精品在线91| 亚洲伊人一本大道中文字幕| 亚洲黄色有码视频| 亚洲天堂一区二区三区| 亚洲精品电影网在线观看| 欧美人与性动交a欧美精品| 午夜精品美女自拍福到在线| 欧美黑人极品猛少妇色xxxxx| 精品无人国产偷自产在线| 2023亚洲男人天堂| 亚洲精品v天堂中文字幕| 日韩一区视频在线| 国内精品免费午夜毛片| 九九久久久久99精品| 91沈先生在线观看| 亚洲天堂av电影| 欧美日韩一区免费| 日韩在线视频网站| 国产精品久久久久久婷婷天堂| 青草青草久热精品视频在线网站| 日韩在线中文字幕| 国内精品模特av私拍在线观看| 国产精品www色诱视频| 国产欧美日韩专区发布| 亚洲伦理中文字幕| 久久亚洲精品一区二区| 亚洲欧美一区二区激情| 九九精品在线视频| 成人精品一区二区三区电影黑人| 亚洲美女av网站| 亚洲国产黄色片| 日韩av电影免费观看高清| 国产69久久精品成人看| 国产成人激情视频| 日韩精品中文字幕在线观看| 国产成人精品免费视频| 成人激情综合网| 青青久久aⅴ北条麻妃| 欧美性极品xxxx做受| 精品久久久在线观看| 疯狂欧美牲乱大交777| 国产美女精品视频免费观看| 国产精品电影久久久久电影网| 97视频在线观看亚洲| 亚洲一级免费视频| 久久精品国产综合| 久久久噜噜噜久久中文字免| 国产日韩在线观看av| 欧美高清无遮挡| 91精品国产自产在线观看永久| 亚洲精品videossex少妇| 欧美电影院免费观看| 成人免费高清完整版在线观看| 色777狠狠综合秋免鲁丝| 国产欧美 在线欧美| 国产精品欧美亚洲777777| 日韩专区中文字幕| 久久高清视频免费| 亚洲天堂男人的天堂| 亚洲国产成人91精品| 久久久久久久久网站| 欧美专区第一页| 亚洲国产精品va在线| 日韩av在线免费播放| 国产精品免费看久久久香蕉| 亚洲天堂av在线免费| 亚洲人精选亚洲人成在线| 亚洲欧洲xxxx| 疯狂欧美牲乱大交777| 成人黄色影片在线| 日产精品久久久一区二区福利| 国产精品成人在线| 国内外成人免费激情在线视频网站| 欧美大尺度在线观看| 日韩风俗一区 二区| 欧美成人精品xxx| 日韩有码在线观看| 在线观看精品国产视频|