發表文章

目前顯示的是 11月, 2012的文章

Access Internal Storage 存取android手機內存

Android 手機的內存是放在 /data/data/<package name>/files,可以使用getFilesDir()得到路徑。如下: File fileDir = getFilesDir(); 每一個app有各自的user id和自己權限跟空間。所以存在手機內存的資料就會權限的問題。要開啟或創建時就需要權限的設定。以android developer內的說法,存取內存要使用openFileOutput這個程式,反回為FileOutputStream。如下: FileOutputStream imageFout = openFileOutput("FileName",MODE_WORLD_READABLE); FileName只要檔名即可,不用完整路徑。 Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身訪問。如果檔案已存在,會覆蓋原檔。 Context.MODE_APPEND:會檢查檔案是否存在,存在則將內容增加到檔案內;如檔案不存在就創建新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。 Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 如想要兩個模式共有,如下 openFileOutput("FileName", MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE); Developer 中的範例如下(建立文字檔) String FILENAME = "hello_file" ; String string = "hello world!" ; try{ FileOutputStream fos = openFileOutput ( FILENAME , Context . MODE_PRIVATE ); fos . write ( string . getBytes ()); fos . close (); }catch(IOExc

萬化細胞動態桌布

圖片
  想要一個多彩又有深度的桌布,所以延用了細胞自動機的原形來實現一個自動成形的桌布。說到細胞自動機,這是一個很有趣的概念。他的規則很簡單 A、 一個細胞如果有二或三個鄰居則可以活到下一刻 , 否則就會死於獨居或壅擠。 我們看一下例圖。中間藍色的部分是我們感興趣的細胞,紅色是鄰居。 因為有兩個鄰居或是三個鄰居所以他們的下一刻藍色細胞還是可以存在。 下兩張圖是鄰居只有一個或是大於三個。所以下一刻,藍色的細胞就消失了。就是死去了。        =======>     B 、一個空格處如果剛好有三個鄰居,則可生出藍色細胞。         =======> 了解這些規則,我們來來看一個六個細胞排成一列的演化三個步驟的過程 看似簡單的規則,是否會讓我們懷疑,這能做什麼? 我們先了解細胞自動機的目地是什麼?電腦之父馮諾曼( John von Neumann )在 1940 年代開始研究細胞自動機( cellular automaton ),目地是為了發展具有自我複製能力的計算工具 。 據說 溤諾曼小時候就有過目不忘的能力,而且計算能力超強。有一次他的母親抬頭想著事,馮諾曼小小年紀就說, ” 媽,你在算什麼,我幫你算… ” 。呵…如果誰家的小孩今天冒出這驚人之語,請貴父母們好好的栽培他。 什麼是 自我複製能力的計算工具,說穿了 就是一種人工生命,人類就是其中的一種。只是演化的規則比細胞自動機複雜多了。從小層次的規則為主,產生大層次上的演化現象。也叫做突現行為。意思是說,將一兩條人們以為簡單的規則加入單一個生命體的行為中,當我們把生命體複製到千千萬萬個時,這一兩條規則會帶來什麼變化。我們看一段影片。 這影片中的鳥是不是被指揮了?是不是被一個更高層的力量給控制?其實不然。他們只遵從兩條規則 一、飛的時候盡量離彼此近一點。 二、飛的時候不要跟別的個體相撞。 簡單的規則,卻出現這樣複雜的行為。這是複雜還是簡單?動畫電影的海底總動員中的一群魚集體的游動就是依這兩條規則改進,用電腦跑出來的結果。 人類的社會也是如此的,每一

GLSurfaceView android 3D 繪圖

圖片
要了解如何在android中實作繪圖,要先知道兩個物件 一個是 GLSurfaceView 一個是 GLSurfaceView.Renderer GLSurfaceView 實作繪圖的視窗,是繼承自SurfaceView的View。因為是繼承自SurfaceView所以一樣有底下這些常用的方法 setRenderer() onPause() onResume() queueEvent() surfaceChanged() surfaceCreated() surfaceDestroyed() ... 其它不多做贅述 GLSurfaceView.Renderer  繪圖物件的處理,所有繪圖的部分都在這裡處理,其下有三個方法      onDrawFrame(GL10 gl) //畫圖函數放在這裡。      onSurfaceChanged(GL10 gl, int width, int height)      onSurfaceCreated(GL10 gl, EGLConfig config) //Render被創立之後,初始化的函數都放在這裡。函數會被執行一次。 主要的Activity,要先把一個GLSurfaceView建入contentView。在這裡就是Oglv。 public class OpenglTest extends Activity {      private Oglv oglv;      public void onCreate (Bundle savedInstanceState){           super.onCreate(savedInstanceState);           oglv = new Oglv(this);           setContentView(oglv);      } } 建一個新的class,名為Oglv,繼承自GLFurfaceView class Oglv extends GLSurfaceView {      private OglvRender oglvRender;      public Oglv(Context mc){           super(mc);           ogl