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都會被執行到