開發平台:

Android studio(version 2.2.3)

實機測試平台:

ASUS Zenfone6(Android 5)

實作內容:

大部分的程式碼(手繪部分)都與參考網站差不多,只是我有做細微的調整(功能表選單、清除畫面、儲存畫面)。所以內文主要以我有修改的部分做一個紀錄。

 

1. 儲存畫面必須要先在app→manifests→AndroidManifest.xml中新增以下2個權限,否則會無法儲存(會出現java.io.IOException: Read-only file system )。

<!-- 創建與刪除檔許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 寫入資料許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

2. 取得手機解析度

第1種方法:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels
int width = displaymetrics.widthPixels;

從Activity中取得WindowManager,再從WindowManager中取得視窗(will create new window),由這個視窗取得相關矩陣資料並對DisplayMetrics做初始化,接下來就可以在DisplayMetrics裡取得螢幕相關資訊。

 

第2種方法:

int mWidth = getResources().getDisplayMetrics().widthPixels;
int mHeight = getResources().getDisplayMetrics().heightPixels;

直接從getResources()取得DisplayMetrics,從DisplayMetrics中取相關的資訊出來。

 

第3種方法:

DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager = 
       (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
int height = dm.heightPixels,width = dm.widthPixels;

第三種方法跟第一種方法差在於第三種方法是取得context的window_service,其餘步驟跟第一種方法差不多。

 

3. 為了要儲存圖片,所以自己先定義一個bitmap,然後在把自己定義的bitmap傳入canvas裡。

DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm)

Paint mpaint = new Paint();
mpaint.setColor(Color.YELLOW);
mpaint.setStyle(Paint.Style.STROKE);
mpaint.setStrokeWidth(10);

Bitmap vBitmap = Bitmap.createBitmap(dm.widthPixels, dm.heightPixels, Bitmap.Config.RGB_565);
Canvas vBitmapCanvas = new Canvas(vBitmap);
vBitmapCanvas.drawLine(0,0,10,10,mpaint);

 

4. 用Bitmap的compress做影像的儲存

 try{
          FileOutputStream fout=new FileOutputStream("/sdcard/draw.png");
          vBitmap.compress(Bitmap.CompressFormat.PNG,100,fout); 
         //vBitmap.compress(影像格式化成(JPG、PNG...等),壓縮比(0~100),stream)
          fout.close();

      }catch(Exception x){

     }

 

程式畫面:

CanvasPainter.jpg

 

程式碼:

https://github.com/shen0512/CanvasPainter.git

參考:

陳鍾誠 (2010年12月04日),(網頁標題) Android 程式 — 手寫繪圖板,(網站標題) 陳鍾誠的網站,取自 http://ccckmit.wikidot.com/ga:drawboard ,網頁修改第 3 版。

http://tomkuo139.blogspot.tw/2010/03/android-canvas.html(Bitmap相關資訊)

http://dean-android.blogspot.tw/2013/09/androiddisplay-metricsdensity-dpi.html(取得螢幕解析度)

http://edscb.blogspot.tw/2012/11/blog-post.html(取得螢幕解析度)

Display

DisplayMetrics

WindowManager

Activity

Resource

Bitmap

arrow
arrow

    a7069810 發表在 痞客邦 留言(1) 人氣()