2014年9月25日 星期四

Prezi



之所以會介紹Prezi,是因為看到他特別的presentation方式,每次在報告的時候都覺得powerpoint非常的單調,覺得少了什麼.... 前陣子去參加聚會的時候,意外看到了Prezi,深深的被他特別的present方式給吸引,我想最近應該會轉用這種東西做投影片了吧!! 上面是我稍微玩一下的作品,可以看出他特別的呈現方式. 在這邊介紹給大家

2014年9月23日 星期二

Android 開發(六十八) listview header animation

最近由於工作的需要寫了一個很簡單的listview header的 animation


這個animation看起來很簡單,實際上也真的是不難啦...不過真的花了我不少時間tune...

首先,我們要做的事情很簡單,就是在itemclick的時候,把header長出來,然後當header長出來之後,在重新click一次就會退回去,所以我們首先會先想到使用
translationY的這個 property.

ObjectAnimator animX = ObjectAnimator.ofFloat(listview, "translationY", 0f, -textview.getHeight());
ObjectAnimator animY = ObjectAnimator.ofFloat(textview, "translationY", 0f, -textview.getHeight());


利用上面的code我們就可以依照我們希望的方法將head (Textview)長出來/藏起來了

But.........
事情永遠不會是我們想的那麼簡單,當利用tranlationY將view往上移動之後就會發現,整個listview變短了,為了避免掉這個問題,所以我們必須在移動完成之後,將listview的height 往下延伸,那要怎麼做?

RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) listview.getLayoutParams();
p.bottomMargin = -textview.getHeight();
listview.setLayoutParams(p);
這樣就可以做出一個簡單的動畫了,最後附上原始版 gist 供大家參考,
ps. code寫的非常凌亂而且有很多地方還可以修改,只是為了展現功能而寫的.


2014年9月15日 星期一

Android 開發(六十七) Triangle drawable

最近有個需求,需要我們利用程式來畫三角形,當下小弟是一點頭緒都沒有,
還好平時有在讀別人code的習慣,就想到了可以使用Path來畫我們需要的圖形,

首先我們必須先選出三角形的三個頂點,


 Point a = new Point(paddingLeft+0+stroke, Math.max(canvas.getHeight()/3*2-(int)TriHeight-stroke,0));
     Point b = new Point(paddingLeft+(int)TriBottom*2 +stroke, Math.max(canvas.getHeight()/3*2-(int)TriHeight-stroke,0));
     Point c = new Point(paddingLeft+(int)TriBottom+stroke, Math.max(canvas.getHeight()/3*2-stroke,0));


上面的三個頂點,會畫出一個倒三角形






會置放在canvas的3分之2的位置,在決定了三個頂點之後,接著就只需要利用PATH將圖畫出來即可,


     Path path = new Path();
     path.setFillType(FillType.EVEN_ODD);
     path.moveTo(a.x, a.y);
     path.lineTo(b.x, b.y);
     path.lineTo(c.x, c.y);
     path.lineTo(a.x, a.y);
     path.close();


上面的程式讓我們可以填滿三角形,並描繪出該三角型。 詳細的程式碼可以參考 https://gist.github.com/nightbear1009/ad4d9d96faeb7a756931

2014年9月10日 星期三

Android 開發(六十六) gradle rebuild 但是修改的參數並沒有被更改

利用 gradle build --rerun-tasks 例如: 在build.gradle 裡寫入這樣的參數 ext { ga_apptracker = "UA-123456-1" ga_global_logLevel = "verbose" ga_global_dryRun = "true" } 然後利用gradle replace掉特定的參數 這個情形在第一次的時候會順利更改資料,但是不知道為何之後就不會再被更改, 即使rebuild也沒有用,我猜測是因為 android studio 將該檔案視為 update to date 所以並不會重新被更動 這樣可以確保project重新 rebuild ,雖然這樣會很花費時間, 但是可以確保build.gradle檔案裡的資料會被更新成最新版本的資料 不過...如果只是要確保每次都會執行,目前有較好的做法 task GABuildValueCopy <<{ copy { ...dosomething } } 在android studio 0.8.6 這樣寫就可以確保每次執行該task都會被執行到

2014年8月21日 星期四

Android 開發(六十五) Gradle 出現 unable to locate a java runtime to invoke

在command line key這些指令之後
$ chmod +x ./gradlew
$ ./gradlew assembleDebug
再重新build即可

目前還不知道為何會發生這個事情...

Android 開發 (六十四) Gradle replace and copy file

在prebuild時要如何修改 xml 裡的檔案?
例如  我們有個buildvalue變數  希望在build的時候做修正




首先必須先創建一個template 接著template中的字串做match 並replace之後將檔案複製到原本的build folder中










照著上面的方法寫,我們必須手動的在build之前打入指令
gradle myCopy
然後等到他完成之後才可以執行 grdle build
也就是說task並不會自動被執行

所以我們可以在gradle file中加入






這代表著在prebuild之前必須先執行 myCopy結果如下
















:app:myCopy代表有跑到myCopy這個task
這樣就會完整執行到我想做的事情了

Android 開發 (六十三) Gradle Flavor

Flavor  利用flavor 可以修改 packageName versionCode versionName
在build.gradle 下新增 productFlavors 設定希望的值
並且在Manifest中做相關設定即可
例如   applicationId 在這邊為 packagename   然後在 manifest中 將參數寫成 ${applicationId}  在build的時候就會置換































利用上面的方式,我們能夠輕鬆的替換package name
接著該如何利用不同的flavor替換不同的ui呢?


假設我們有100間店,以及1000種ui
那我們就需要兩個參數來控制色碼和店家
首先我們先在 flavorDimensions  中定義 color and shopNum 




接著定義各個color 以及 shopNum要吃的參數
如下  color1的 flavorDimension 為color代表著  color1 是代表color參數而
shop1 的 flavorDimension為 shopNum代表著 shop1代表著shopNum的參數
可以看到我們在color1 以及shop1 中各定義了一些參數














由於我們必須換圖 為了達到這個目的,我們只需要在folder中創建 color1 and color2 














接著當我們要build的時候  只需點選左下角的 build Variants  接著選取我們要build的項目即可,
color1Shop1Debug  or  color2Shop2Debug ...etc