現在不管是Google+也好, 或是Facebook (Home), 似乎都很喜歡用圓形的大頭貼像這樣 (左上角圖形,

但在server端存的大頭照其實都是都是方形的, 所以必須抓下來後再轉畫成圓的, 最近從網路抓圖的部分, 我還蠻喜歡用Picasso

沒啥別的原因, 就是它簡單, 雖然說, 它似乎還是有一些小小問題, 不過它可以用這樣短短一行解決圖檔下載並顯示到ImageView的一連串動作:

Picasso.with(context).load("http://bit.ly/11DoFZL").into(imageView);

不過, 簡單的代價可能在其他的地方來說彈性就不高了, 不過, 做這樣一個小玩意兒的彈性倒是還有, 在Picasso中, 可以實作Transformation把下載下來的圖檔再作一次後處理, 在它的網頁有一個CropSquareTransformation的範例, 圓形的大頭貼可以視為這一個的延伸:

這邊利用了BitmapShader重畫了一張圓形的大頭貼, 出來的結果就會像是這樣:




via Blogger http://bit.ly/11DoEVG

Androids Do Daydream裡有提到Romain Guy要他提(大概假的吧)在layout裡面放"<blink>“可以做到view閃爍的效果而不用寫到一行code

查了一下AOSP的原始碼也的確有這東西, 它是一個躲在LayoutInflater的一個叫BlinkLayout的東西, 這樣一來就可以配合TextClock (API Level 17)來做一個閃爍的時鐘了


不過, 這樣, 是整個TextClock在閃, 而不是像一般數字鐘一樣是只有”:“閃, 如果要做到只有”:“在閃, 那只好把"時"跟"分"給拆開, 像這樣:



via Blogger http://julianshen.blogspot.com/2013/06/android-blinklayout.html

本想說有直接整合了Git, GitHub是件不錯的事, 沒想到要把新project push到remote git就栽了….

Android Studio/Intellij 似乎沒介面設定remote (搜尋了半天沒發現這種答案, 啃了半天的使用手冊也沒發現), 現在如果要把既有的project給匯出到遠端的git (如bitbucket), 就得利用command line (以bitbucket 為例):

  1. 在bitbucket上create一個新的project
  2. 在Android studio選"VCS"->“Import into version control”->“Create Git repository”, 這樣就可以建立一個local的repository
  3. “VCS”->“Git”->“Add to VCS”
  4. “VCS”->“Git”->“Commit File”
  5. 到command line下切換到project目錄下“git remote add origin ssh://[email protected]/xxx/xxx.git”
  6. 回到Android studio, “VCS”->“Git”->“Push”
要注意的是, 如果你已經有一個remote repository,“VCS”->“Import into version control”->“Share project on GitHub"會失敗




via Blogger http://bit.ly/13MAjob

最近試用Android studio開發, 可能有些習慣被以往Eclipse慣壞了, 剛剛發現放在libs/底下的東西不像以前會被自動建置到apk內, 有點小訝異, 對jar file來說, 可能還好不算太難, 在build.gradle的dependencies內補上一筆就夠了, 但對native library (jni)那些.so檔, 就沒辦法

用這樣解決了 Google了一下, 並且在Stack overflow上找到些解法來試, 可能因為Android studio跟Gradle Android plugin還一直在變化中, 在現在這版一直沒成功, 後來小改一下成底下這樣就成功了:


原本找到的解法是pkgTask.jniDir new File(‘build/native-libs’) , 這樣會得到

> Directory 'build/native-libs’ specified for property 'jniDir’ does not exist.
把"new File"改成"file"就沒問題了,不過現在一切應該都還在開發中, 未來可能會有原生的native lib 支援也不一定, 未來可能這方法也不管用了吧


via Blogger http://bit.ly/13Ouh50

原本在Android下解析JSON內容,  大多用JSONObjectJSONArray, 這兩個是很簡單的JSON parser, 只要將字串(String)傳入即可

不過, 這跟在用DOM解析XML是有類似的問題, 解析文件是一氣呵成, 必須要把所有內容先走過一遍, 也需要更多的記憶體來儲存, 這對於解析較大的文件是一個大問題, 必須要花費更多時間和空間, 而且如果所需要的資料就算只是整份文件中間的一小部分, 還是得先把整份文件走完, 在XML, 可以用SAX來解決這問題, 但Android要到API level 11(Honeycomb) 才新增了JsonReader這個算是JSON界的SAX的解決方案

 JsonReader類似SAX, 也是一種streaming parser, 並不用一次讀出所有字串內容, 它要的只是個Reader, 但不太像SAX屬於事件驅動(event driven)的方式, 它應該比較像token consuming, 它定義了幾類基本的JsonToken,  它也有BEGIN(END)_OBJECT, BEGIN(END)_ARRAY這種類似SAX中startElement, endElement, 但卻沒類似SAX的startDocument

解析一個JSON物件的程式碼如下:

     {username:"Bob", age: 14, sex: "m"} 
     reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("username")) {
username = reader.nextString();
} else if (name.equals("age")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}

}
reader.endObject();
解析一個物件, 要從beginObject開始(陣列則是beginArray), endObject結束, 接著透過一個while loop一個個走過這物件內所有的token, 說實在的, 不是很好debug,  你必須要先知道下一個要處理的token是啥類別, 以上面的例子為例, 物件內第一個token是"username", 這是一個JsonToken.NAME, 因此要用nextName來處理, 搞錯了就會出錯, 還不容易知道錯哪,  而上面那例子裡的"else"也是必須的, 拿掉的話, 在endObject就會出錯, 因為這段程式並沒去處理"sex", 因此處理完sex這個名字後, 並未消化掉"m"這個值(JsonToken.STRING), 而是直接endObject, 這會產生一個IllegalStateException

為了避免用了錯誤的方式處理下一個token, 可以先用peek()來看一下下一個要處理的種類

在可讀性上, 用JsonReader寫出的並不是很好, 但它卻適合來處理大的JSON文件, 或是像Twitter Streaming API這種幾乎無止盡的

這當然也不是只有在Android上有, Google也早把這也包含到GSON去了

via Blogger http://bit.ly/16rSFLZ