2017年5月31日 星期三

Android Studio 使用WebP縮圖減少APK Size。

Android Studio 可以將 PNG, JPG, BMP, GIF 轉為 WebP,可有效縮小圖檔大小。
Android 4.0(API 14) 以上就可以支援WebP
但含透明的圖片,需要Android 4.2.1(API 17)才支援。
你可以轉一個檔案,或將整個資料夾一起轉。

右鍵點擊圖檔或資料夾,點擊 Convert to WebP
這裡可設定壓縮比


下圖可以看到檔案縮小了,圖檔也看不出2張有什麼差異。



也可以從這裡下載Webp轉檔工具
https://developers.google.com/speed/webp/

參考
https://developer.android.com/studio/write/convert-webp.html

Android 9-Patch 建立自動調整大小以適應視圖內容與螢幕尺吋的圖片

Android 可以使用9-Patch建立自動調整大小以適應視圖內容與螢幕尺吋的圖片,
例:我要把這個圖檔當作我的背景圖,裡面放文字用。紫色區塊需要隨著裡面的字變多而延展。



做成像下圖的效果:



作法很簡單:
在android studio,右鍵點擊要建立NinePatch的png圖檔,然後點擊 Create 9-path file。
點擊9-patch檔案,在android studio 打開,會出現如下畫面

在4個邊邊的灰白相間的線,點一下加上黑線,這個黑線代表可延展區塊
要取消黑線的話,按住shift再點一下黑線就可以了。
勾選下方的Show patchs,可以看到粉紅色的區塊為可延展區塊,綠色區塊為不可延展區塊。



另外如果你build 看到這樣的訊息:some file crunching failed ,代表你的 9-patch 檔案有問題
開啟9-patch檔案,勾選 Show bad patches,就可以看到錯誤在哪裡了


完整程式碼:https://github.com/evanchen76/NinePatchSample

參考:https://developer.android.com/studio/write/draw9patch.html

2017年5月30日 星期二

Android Notification 的幾種樣式

推播內容加上一張小圖片




推播內容加上大圖加上下方的按鈕



//載入bitmap
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.user);
//設定大圖Style
NotificationCompat.BigPictureStyle bitStyle = new NotificationCompat.BigPictureStyle();
bitStyle.bigPicture(largeIcon);
//設定按鈕
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.addAction(R.mipmap.ic_launcher, "Reply", replyIntent)



推播內容使用客製的View



//new RemoteViews 載入客製layout
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_view);
//設定使用CustomView
notificationBuilder.setCustomBigContentView(remoteViews);



客製view
notification_view.xml


完整程式碼:https://github.com/evanchen76/PushNotificationSample

參考:https://developer.android.com/guide/topics/ui/notifiers/notifications.html

2017年5月27日 星期六

Android Canvas 繪製幾何圖形

Canvas的意思就是畫布
Paint 代表了Canvas上的畫筆
以下範列記錄幾種Canvas繪製幾何圖向的方法

canvas.drawArc (扇形)
canvas.drawCircle(圓)
canvas.drawOval(橢圓)
canvas.drawPoint(點)
canvas.drawRect(矩形)
canvas.drawRoundRect(圓角矩形)
canvas.drawLine(線)
cnavas.drawPath(路徑)

DrawCircle


DrawArc


DrawOval


DrawLine



DrawPath


DrawPoints


DrawRect


DrawRoundRect


完整程式碼: https://github.com/evanchen76/CanvasSample

2017年5月24日 星期三

Android Gradle productFlavors 匯出不同版本APK


在開發android app時,我們可能會有如下的需求:

正式版與測試版,會有正式版連線的API與測試版連線的API,
或是測試環境與正式環境有不同的ApplicatoinId時,
這時就可以使用Gradle productFlavors,依不同的版本設定不同的參數

在Gradle裡加上productFlavors ,將版本分為dev、prod
dev、prod各使用不同的applicationId

productFlavors {
    dev {
        applicationId "evan.chen.app.productflavorsample.dev"        
resValue "string""version_type""Free Version"    }

    prod {
        applicationId "evan.chen.app.productflavorsample"       
resValue "string""version_type""Pro Version"    }
}

接著建立一個Constants裡放API的網址。



public class Constants {
    public static final String API_URL "http://staging-api.evanchenapp.com";
}




public class Constants {
    public static final String API_URL "http://api.evanchenapp.com";
}


MainActivity 取得 API_URL

public class MainActivity extends AppCompatActivity {

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("Log""Url:" + Constants.API_URL);
    }
}

最後,在Build Variants選擇build的版本就可以了

2017年5月23日 星期二

android Keyguard 呼叫螢幕解鎖驗證

android 的 Keyguard 可以用來呼叫螢幕解鎖來驗證,
運用在有做自動登入時,避免使用者手機被偷,可以在app的重要功能再次要求解鎖

以下這個範例,
按下Verify按鈕時,會依照你的手機設定的解鎖方式開啟驗證(PIN、Password、Pattern、Fingerprint)



要使用Keyguard,API Level 21 以上。

先檢查手機是否有開啟螢幕鎖定。 在Activity 叫起驗證頁,可以客制Title、Description



接收解鎖結果:


完整程式:

參考:

2017年5月12日 星期五

Android MVP Pattern (Model View Presenter)

MVP (Model View Presenter)是由MVC (Model View Controller)演變而來。
在MVC的架構,通常會把layout(xml)當成View,Activity當成Controller,
事實上,Activity 卻是Controller 與View 的混合,於是Activity既要做處理View,也負責商業邏輯。使得Activity越來越肥。

MVC ->  MVP 的最大差異在於 Activity的商業邏輯移到Presenter,Activity 專心於View

MVP:
Model - 提供資料、儲存資料 例:SharedPreferences、呼叫API
View - 負責展示UI,如 Activity、Fragment
Presenter - 負責邏輯處理

來看看這個範例,輸入帳號密碼後,按下「LOGIN」顯示登入成功或失敗。


新增LoginActivty 為MVP 中的View
新增LoginContract ,裡面放了ILoginView、ILoginPresenter 2個Interface
新增LoginPresenter,負責商業邏輯,與Model互動。
建立 User Model,負責檢查帳號是否正確。(範例單純hard code判斷,一般在此與API 登入)



LoginActivity ( View )


LoginPresenter (Presenter)
User (Model)




完整程式
https://github.com/evanchen76/MVP-Pattern