2013年11月15日 星期五

Android KitKat Overview (沒寫完)

4.4版出了,看文章順便寫一點摘要

來源:http://developer.android.com/about/versions/kitkat.html

1. Making Android for everyone
為什麼用這個標題我不太懂,簡單說就是比以前更強了 (廢話:每次改版都有這句)。
基本上改善記憶體的使用量,使得heap不會那麼容易爆,也可以適用於記憶體只有512MB的簡易型Android SmartPhone。

提供一個新的API:ActivityManager.isLowRamDevice(),可以讓開發者調整組態以適合記憶體限制。Learn more about optimizing your apps for low-memory devices here.

新增兩個記憶體管理工具:procstats tool, meminfo tool

2. New NFC capabilities through Host Card Emulation
支援安全的NFC 電子錢包交易

3. Printing framework
支援WiFi和雲端列印服務

4. Storage access framework
一個新的 storage access framework,可以讓開發者更簡單的瀏覽與打開文件、影像等檔案。

5. Low-power sensors
支援hardware sensor batching,可以讓sensor更省電,對於一些low-power, long-running的使用情境有幫助。例如:fitness, location tracking, monitoring, and more.

目前sensor batching僅在Nexus 5上面有作用,其他需要等新的機器安裝特定的晶片組

支援兩種新的sensor:Step Detector and Step Counter


Moves and Runtastic Pedometer are using the hardware step-detector to offer long-running, low-power services.

6. SMS provider
沒啥好講的




7. New ways to build beautiful apps

i. 新增 Full-screen Immersive mode, 全螢幕 "浸入"?? 模式
能夠使用螢幕上的每一個pixel,包含螢幕上方的status bar範圍。適合用來開發照片瀏覽、影片播放、地圖、電子書、以及遊戲。

在此模式下system UI將被隱藏。為了讓使用者能夠使用system UI,一個新的手勢控制在此模式下被支援來由上下邊界將system UI 顯露出來。

ii. Transitions framework for animating scenes
改善動畫產生與顯示過程。定義一個新的名詞scenes(場景),包含一組view hierarchies 和 動畫轉換,用在使用者切換theme的時候。基本上是讓轉場動畫愈來越容易被設計。


iii. Translucent system UI styling
半透明的系統UI風格


iv. Enhanced notification access
增強notification listener(通知監聽)功能,現在可以由text, icon, progress, chronometer等物件中提取監聽了。

v. Chromium WebView
BJ4



8. New media capabilities

i. Screen recording
新增螢幕錄影功能能將螢幕內容記錄成一個MP4檔案;提供一組screen recording utility方便製作APP教學、製作影片等。

如果APP內容不願意被別的手機用此功能記錄下來則需要用 SurfaceView.setSecure()來設定。這等於說需要開發者預設的內容又多了一個。

ii. Resolution switching through adaptive playback
播放影片時可以調整影片的解析度,這對播放youtube有點好處。


(....未完)

























2012年9月29日 星期六

ExpandableListView 裡面的groupIndicator

SDK 4.0裡面 ExpandableListView的 groupIndicator有點醜 (左邊收合與展開的表現圖示),想要把他換掉,有一點教學的需求就順便把流程記下來

預設值是@android:drawable/expander_group_holo_light
換掉groupIndicator的方法很簡單,就在xml檔案裡面修改Group Indicator屬性即可

android:groupIndicator="stateful Drawable "

這裡需要一個drawable的.xml檔案,可以直接拷貝expander_group_holo_light.xml來改,如果不曉得這個檔案在哪裡,用最笨的方法在sdk了目錄裡面用Windows的檔案搜尋就可以找到。

檔案的內容如下
Source file
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 3     <item
 4         android:state_expanded="true"
 5         android:drawable="@drawable/expander_open" />
 6     <item
 7         android:drawable="@drawable/expander_close" />
 8 </selector>

這時候需要準備兩張圖片expander_open.9.png 和 expander_close.9.png。這份文件的重點有一部分在9png檔案,如果檔案不是用9png檔會被系統自動縮放且會失去原本的長寬比例,反而讓畫面變醜。

2012年8月15日 星期三

實現Activity間的轉換動畫

Android 2.0以後提供了一個簡單的方式讓兩個Activity之間的切換能夠生動一點。利用:

public void overridePendingTransition (int enterAnim, int exitAnim)



這個函式只要放在startActivity()或是finish()之後就可以。它主要是利用Tween animation來完成頁面的轉跳。

enterAnim為將要進入的頁面的animation。exitAnim為要轉出的頁面的animation。這兩個animation可以寫在res/anim目錄下,以下是我測試過還不錯的動畫

enterAnim: in_from_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
     <translate
        android:duration="300"
        android:fromXDelta="100%p"
        android:toXDelta="0%p" />
</set>


exitAnim: out_to_left.xml


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator" >

    <translate
        android:duration="300"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p"
        android:startOffset="100" />
</set>

java code:

...
startActivity(intent);
overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
...


補充:Fragment間的切換可以利用下面兩種方式來處理
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

或是
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);


2012年6月27日 星期三

這個很好玩 - MIT App Inventor

原本由Google lab所開發的App Inventor已經交給MIT行動學習中心維護,現改名為MIT App Inventor,很好玩的一個程式開發概念。

還有一個中文學習網http://www.appinventor.tw/

2012年5月13日 星期日

了解Android resource檔案 (三)

這份文件說明resource的命名,辨識以及取用所需要注意的一些小細節
  • @+id/text1
<TextView
        android:id="@+id/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

1. id並不是一定需要的,除非在java程式當中需要引用此控制項
2. "@+id/" 表示在這個activity當中如果沒有存在此id則新建一個。"@id/"則是表示使用已經定義過的id
3. id是以activity為範圍,在一個activity中id不可以重覆,但在不同activity當中可以容許重覆的id
4. 產生的id會在R.java類別當中產生一個public static final int 的constant來唯一的指名。不管你的應用程是裡面有多少個activity,使用了多少個同名的id,在R.jav當中所有同名的id會共用同一個constant。
    R.java範例
package xxx.xxxxx.xxx;


public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class id {
        public static final int text1=0x7f050000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}


  • 放在res/raw裡面的xml檔案並不會被編輯成為binary file,也不會被放入.apk當中
  • String Arrays
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/values/arrays.xml -->
<resources>
    <string-array name="week">
        <item >星期日</item>
        <item >星期一</item>
        <item >星期二</item>
        <item >星期三</item>
        <item >星期四</item>
        <item >星期五</item>
        <item >星期六</item>
    </string-array>   
</resources>







/** .java file for getting String Array from xml */
Resource res = activity-name.getResources();
String[] st = res.getStringArray(R.array.week);


  • Plurals
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/values/students_in_class.xml -->
<resources>
    <plurals name="students_in_class">
        <item quantity = "one">There is 1 student</item>
        <item quantity = "other">There are %d students</item>     </plurals>   
</resources>


/** .java for getting Plurals from xml */
Resource res = activity-name.getResources();
String st1 = res.getQuantityString(R.plurals.students_in_class, 0, 0);
String st2 = res.getQuantityString(R.plurals.students_in_class, 1, 1);
String st3 = res.getQuantityString(R.plurals.students_in_class, 2, 2);
String st4 = res.getQuantityString(R.plurals.students_in_class, 100, 100);


輸出:
There are 0 students
There is 1 student
There are 2 students
There are 100 students


Plurals是為了語系上面有單複數型差異的語言所設計,在中文的用法上較少被使用,不過用它來產生鑲嵌一個整數的字串還是蠻方便的。



  • String
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/values/strings.xml -->
<resources>   
    <string name="SimpleString">Simple String</string>
    <string name="good_example">"This'll work"</string>
    <string name="good_example_2">This\'ll also work</string>
    <string name="bad_example">This doesn't work</string>
    <string name="bad_example_2">XML encodings don&apos;t work</string>
</resources>

Andoird支援部分的java String Format以及部分的HTML格式(ref.http://developer.android.com/guide/topics/resources/string-resource.html)


Formatting strings



<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>


Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);


Styling with HTML markup



<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

目前支援的tag只有

  • <b> for bold text.
  • <i> for italic text.
  • <u> for underline text.

Note: 使用Eclipse編輯時,需要利用資源編輯視窗來編輯HTML字串,不要直接編寫.xml檔案。編輯器會將上面的標籤再做一次轉換變成

              <string name="welcome">Welcome to &lt;b&gt;Android&lt;/b&gt;!</string>

這樣才能正確顯示。

String htmlString = getApplicationContext().getString(R.string.welcome);
// convert it to a text span so that i can be set in a text view
Spanned textSpan = android.text.Html.fromHtml( htmlString );

其他相關Html格式的運用在http://developer.android.com/reference/android/text/Html.html





2012年4月12日 星期四

了解Android resource檔案 (二)

接續上一個單元了解Android resource檔案 (一)

如果去追一下textAppearanceSmall可以找到

    <style name="TextAppearance.Small">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">?textColorSecondary</item>
    </style>

這說明textAppearanceSmall這個設定同時設定了字體大小以及顏色。我們有興趣的地方在顏色的設定,所以追蹤一下顏色可以發現

<item name="textColorSecondary">@android:color/secondary_text_dark</item>




以及在....res\color\目錄下的secondary_text_dark.xml檔案





<?xml version="1.0" encoding="utf-8"?>


            .......


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="false" android:color="@android:color/dim_foreground_dark_disabled"/>
    <item android:state_window_focused="false" android:color="@android:color/dim_foreground_dark"/>
    <item android:state_selected="true" android:state_enabled="false" android:color="@android:color/dim_foreground_dark_inverse_disabled"/>
    <item android:state_pressed="true" android:state_enabled="false" android:color="@android:color/dim_foreground_dark_inverse_disabled"/>
    <item android:state_selected="true" android:color="@android:color/dim_foreground_dark_inverse"/>
    <item android:state_activated="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:state_pressed="true" android:color="@android:color/dim_foreground_dark_inverse"/>
    <item android:state_enabled="false" android:color="@android:color/dim_foreground_dark_disabled"/>
    <item android:color="@android:color/dim_foreground_dark"/> <!-- not selected -->
</selector>




這份文檔在Android裡面稱做State List,一般用來變換一個繪圖元件在不同狀態下的顯示圖片。


狀態的定義有 (原文照拷比較原汁原味)


android:state_pressed
Boolean. "true" if this item should be used when the object is pressed (such as when a button is touched/clicked); "false" if this item should be used in the default, non-pressed state.
android:state_focused
Boolean. "true" if this item should be used when the object has input focus (such as when the user selects a text input); "false" if this item should be used in the default, non-focused state.
android:state_hovered
Boolean. "true" if this item should be used when the object is being hovered by a cursor; "false" if this item should be used in the default, non-hovered state. Often, this drawable may be the same drawable used for the "focused" state.
Introduced in API level 14.
android:state_selected
Boolean. "true" if this item should be used when the object is the current user selection when navigating with a directional control (such as when navigating through a list with a d-pad); "false" if this item should be used when the object is not selected.
The selected state is used when focus (android:state_focused) is not sufficient (such as when list view has focus and an item within it is selected with a d-pad).
android:state_checkable
Boolean. "true" if this item should be used when the object is checkable; "false" if this item should be used when the object is not checkable. (Only useful if the object can transition between a checkable and non-checkable widget.)
android:state_checked
Boolean. "true" if this item should be used when the object is checked; "false" if it should be used when the object is un-checked.
android:state_enabled
Boolean. "true" if this item should be used when the object is enabled (capable of receiving touch/click events); "false" if it should be used when the object is disabled.
android:state_activated
Boolean. "true" if this item should be used when the object is activated as the persistent selection (such as to "highlight" the previously selected list item in a persistent navigation view); "false" if it should be used when the object is not activated.
Introduced in API level 11.
android:state_window_focused
Boolean. "true" if this item should be used when the application window has focus (the application is in the foreground), "false" if this item should be used when the application window does not have focus (for example, if the notification shade is pulled down or a dialog appears).







回到secondary_text_dark.xml這份文件,每一個<item ... />表示一個狀態,所以在寫的時候需要確認到每一個<item ... />之間是互斥的關係。所以
<item android:state_pressed="true" android:state_enabled="false" android:color="@android:color/dim_foreground_dark_inverse_disabled"/>


表示當此TextView被按住(state_pressed="true")且此TextView是被除能的(disabled, 看上面的英文會比較理解這在說什麼)則此TextView的顏色變換成dim_foreground_dark_inverse_disabled所定義 (查一下它的顏色代碼是 #80323232)






我們常用State List來變換按鈕的狀態,譬如壓下按鈕然後放開會有一個顏色的變換讓使用者感覺到按鈕確實有被觸碰到。xml範例如下



<!-- filename: buttonbackground.xml  -->


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
   
    <item 
        android:drawable="@drawable/未按下時的圖片.png" 
        android:state_pressed="false" 
        android:state_selected="false"/>
    
    
    <item 
        android:drawable="@drawable/ 按下時的圖片.png 
        android:state_pressed="true"/>
</selector>


然後將Button的視圖的background屬性指向的這xml檔案即可。








2012年4月10日 星期二

了解Android resource檔案 (一)

資源 (Resource) 在Android裡面凡指一切除了程式碼以外的資料。它可以是一個檔案,像是一個mp3音樂檔或是一個xml的版面layout檔;也可以是一個系統參數值像是一個預設的字串,一個定義button按鈕的高度的整數或是一個背景的顏色定義。撰寫程式的時候應該學習將程式碼與資源當作是獨立的文件來處理,這對日後多語系以及多螢幕的支援都有很大的幫助。

這份文件談資源由兩個方向分別討論。第一個以資源的類型來討論,分別討論資源的取用方式。第二個方向則討論系統預設資源的取用以及使用者自定資源的方式。一般來說我們建議盡量使用系統預設的資源,系統沒有的才使用自定資源來輔助,這樣可以加快程式的撰寫以及各平台間的相容性。

 Android常用資源類型:
  • String (字串)
  • Layout (面板配置)
  • String Array (字串陣列)
  • Plurals (一個字串的集合,用來表示數量通常是複數形式)
  • Color (顏色)
  • Dimension (尺寸)
  • Image (圖片)
  • Color-Drawable (一個被著色的方型,由xml寫成)
 Android系統資源存放於<android-sdk-windows>\platforms\<android version>\data\res 目錄下。初學者最先碰到會使用的應該是...\res\values\attrs.xml 檔案裡面的字型設定還有顏色設定。如果利用Eclipse IDE隨便拉一個TextView控制項,它的屬性如下:
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

這裡表示這個TextView的文字Style以系統內定的?android:attr/textAppearanceLarge來顯示。定義的資料可以在R.attr裡面找到。定義如下:          

public static final int textAppearanceLarge

Since: API Level 1
Text color, typeface, size, and style for "large" text. Defaults to primary text color.
Must be a reference to another resource, in the form "@[+][package:]type:name" or to a theme attribute in the form "?[package:][type:]name".
Constant Value: 16842816 (0x01010040)

如果仔細去追可以在...\res\values\attrs.xml裡面找到
        <!-- Text color, typeface, size, and style for "large" text. Defaults to primary text color. -->
        <attr name="textAppearanceLarge" format="reference" />

一個 <attr>單元有兩屬性:name以及formatname就是這個<attr>的名字,可以讓他在別的地方被參考到。 format表示這個<attr>是符合哪一種格式。formate可用格式有:
    • reference - if it references another resource id (e.g, "@color/my_color", "@layout/my_layout")
    • color
    • boolean
    • dimension
    • float
    • integer
    • string
    • fraction
    • enum - normally implicitly defined
    • flag - normally implicitly defined
舉上面TextView的例子來說,我們可以在...\res\values\attrs.xml裡面找到

<declare-styleable name="ViewGroup_Layout">
                           .....
        <attr name="layout_width" format="dimension">
           
            <enum name="fill_parent" value="-1" />
            
            <enum name="match_parent" value="-1" />
            
            <enum name="wrap_content" value="-2" />
        </attr>
                                 .....
         

這定義"layout_width"是一種"dimension"的屬性,所以在TextView裡面  android:layout_width="wrap_content"  或是 android:layout_width="60dp" 這樣的敘述句就變成有定義。

回到<attr name="textAppearanceLarge" format="reference" />, reference 表示textAppearanceLarge 可以在...\res\values\themes.xml 裡面找到它的定義。
       <style name="Theme">
                    ....
            <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
                    ....
        
繼續往下追可以在...\res\values\style.xml裡面找到
      <style name="TextAppearance.Large">
        <item name="android:textSize">22sp</item>
    </style>

在Android程式設計個過程,我們提供程式碼追蹤的過程但不建議更改這些設定值。這裡我們也了解到textAppearanceLarge其實是一個Style設定,所以程式碼寫成
      
android:textAppearance="?android:attr/textAppearanceLarge"  或是

      sytle="?android:attr/textAppearanceLarge" 實際上是一樣的。

 Android 常用系統預設文字大小以及顏色
  • 文字大小  android:textAppearance="?android:attr/textAppearanceLarge"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textAppearance="?android:attr/textAppearanceSmall"
  • 字體顏色 android:textColor="?android:attr/textColorPrimary"
    android:textColor="?android:attr/textColorSecondary"
    android:textColor="?android:attr/textColorTertiary"
    android:textColor="?android:attr/textColorPrimaryInverse"
    android:textColor="?android:attr/textColorSecondaryInverse"