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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平湖市| 利津县| 兴宁市| 武定县| 宣化县| 大邑县| 宜黄县| 呼和浩特市| 沙田区| 义乌市| 石首市| 康平县| 行唐县| 萨嘎县| 大竹县| 衡东县| 台前县| 中阳县| 贡嘎县| 松滋市| 华亭县| 东乌珠穆沁旗| 辉南县| 上饶市| 襄城县| 公安县| 泗洪县| 涟水县| 阳东县| 韶山市| 弥渡县| 高淳县| 巴林左旗| 天津市| 雷州市| 北辰区| 新河县| 抚顺市| 长春市| 方山县| 甘谷县|