搜尋此網誌

2010年10月16日 星期六

專業訓結束

一眨眼5週的專業訓又結束了 在這邊的日子過得還不錯 接下來就是要下部隊了 受苦受難的開始orz 離開學校單位 放假時間就開始不固定了 就是用排假的方式 不知道下次放假是什麼時候了

2010年9月13日 星期一

新訓

很快的7天的結訓假要尾聲了 時間過得好快阿~接下來就要到專業訓的地方受訓了
新訓的時候 都會覺得7天是相當漫長
還記得剛進來的時候 相當不適應 很多事都會被管 洗澡吃飯時間 都非常的趕 至於打電話是 一直到第四天還第五天才開放 等電話打通的時候 真的會有一種莫名想掉眼淚的衝動 訓練也是非常的辛苦 很多人撐不下去 就退訓了
不過我都把它當作上健身房(只能這麼想了><) 每天都跟同寢互相鼓勵 互相倒數還有幾天放假等 只能說新訓的時候過得非常充實 到了最後結訓那天 真的會開心到跳起來~因為很快的就要出去了 吃很久沒吃過的東西 見很久沒見到的北鼻~謝謝北鼻 在電話裡一直鼓勵我 也寫信給我 讓我有支撐下去的動力^^ 我終於撐過新訓了QQ 接下來就是要度過專業訓了

2010年6月21日 星期一

Android開發-UIImageView


在android上顯示圖片 有兩種方法 一種是直接在xml裡面用imageview 或者 用code的方式來顯示 這和iphone是相似的(xib和code)

首先先把要顯示的圖檔丟到專案中的res/drawable資料夾

接著開始寫程式
方法一:在xml加入imageview
main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
//加入ImageView
<ImageView
android:id="@+id/widget27"
android:layout_width="37px"
android:layout_height="wrap_content"
//one為圖檔的名字
android:src="@drawable/one"
android:layout_x="140px"
android:layout_y="162px"
>
</ImageView>
</AbsoluteLayout>

方法二:用code的方式
ImageView.java

package com.demo.android.imageview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.AbsoluteLayout;
import android.widget.Gallery.LayoutParams;

public class Imageview extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AbsoluteLayout mAbsoluteLayout = new AbsoluteLayout(this);
//產生ImageView object
ImageView imageView = new ImageView(this);
//讀取圖檔
imageView.setImageResource(R.drawable.one);
//設定圖片大小和位置
//AbsoluteLayout.LayoutParams (int width, int height, int x, int y)
//
LayoutParams.WRAP_CONTENT 用圖片的原始大小 x,y為圖片的顯示位置
myview.setLayoutParams(new AbsoluteLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,130,192));
mAbsoluteLayout.addView(myview);
setContentView(mAbsoluteLayout);
}
}

2010年6月17日 星期四

Android開發-實際應用(一)基礎代謝率


這次程式是撰寫 計算人的基礎代謝率 其實此程式在iphone已經寫過了 這次因為在練習 所以將此程式又寫了另外一個版本在android上 而寫此程式的目的在於 將之前學過的東西再複習一次 增加熟練度

main.xml
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<EditText
android:id="@+id/height"
android:layout_width="122px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="130px"
android:layout_y="22px"
>
</EditText>
<TextView
android:id="@+id/widget28"
android:layout_width="wrap_content"
android:layout_height="22px"
android:text="Height(cm)"
android:layout_x="40px"
android:layout_y="32px"
>
</TextView>
<TextView
android:id="@+id/widget29"
android:layout_width="wrap_content"
android:layout_height="23px"
android:text="Weight(kg)"
android:layout_x="40px"
android:layout_y="102px"
>
</TextView>
<EditText
android:id="@+id/weight"
android:layout_width="122px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="130px"
android:layout_y="92px"
>
</EditText>
<TextView
android:id="@+id/widget31"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Age"
android:layout_x="60px"
android:layout_y="162px"
>
</TextView>
<EditText
android:id="@+id/age"
android:layout_width="123px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="130px"
android:layout_y="152px"
>
</EditText>
<RadioGroup
android:id="@+id/myradio"
android:layout_width="288px"
android:layout_height="76px"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_x="10px"
android:layout_y="202px"
>
<RadioButton
android:id="@+id/manradio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Man"
>
</RadioButton>
<RadioButton
android:id="@+id/womanradio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Woman"
>
</RadioButton>
</RadioGroup>
<Spinner
android:id="@+id/spinner"
android:layout_width="194px"
android:layout_height="wrap_content"
android:layout_x="120px"
android:layout_y="312px"
>
</Spinner>
<TextView
android:id="@+id/display"
android:layout_width="240px"
android:layout_height="42px"
android:background="#ffff6600"
android:layout_x="40px"
android:layout_y="382px"
>
</TextView>
<Button
android:id="@+id/calculate"
android:layout_width="77px"
android:layout_height="wrap_content"
android:text="calculate"
android:layout_x="30px"
android:layout_y="312px"
android:onClick="Calculate"
>
</Button>
</AbsoluteLayout>

Health.java

package com.android.demo.health;


import java.text.DecimalFormat;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class Health extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findview();
spinnercontent();
setlistener();
}
private EditText Height,Weight,Age;
private TextView display;
private Spinner spinner;
private float a;
private RadioGroup Myradiogroup;
boolean man,woman;
private void findview()
{
Myradiogroup=(RadioGroup)findViewById(R.id.myradio);
Height=(EditText)findViewById(R.id.height);
Weight=(EditText)findViewById(R.id.weight);
Age=(EditText)findViewById(R.id.age);
spinner=(Spinner)findViewById(R.id.spinner);
display=(TextView)findViewById(R.id.display);
}
private RadioGroup.OnCheckedChangeListener changeradio=new RadioGroup.OnCheckedChangeListener()
{
public void onCheckedChanged(RadioGroup group, int checkedId)
{
//判斷user是圈選男性或女性
switch(checkedId)
{
case R.id.manradio:
man=true;
break;
case R.id.womanradio:
woman=true;
break;
default:
Toast.makeText(Health.this,"You don't select something else",Toast.LENGTH_LONG).show();
}
}

};
private void setlistener()
{
spinner.setOnItemSelectedListener(spinnerListener);
Myradiogroup.setOnCheckedChangeListener(changeradio);
}
//設定下拉式選單的內容
private void spinnercontent()
{
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,new String[]{"很少運動或完全沒運動","每週運動1到3次","每週運動3到5次","每週運動6到7次","每天非常重度的運動"});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
//監聽user選了下拉式選單的選項
private Spinner.OnItemSelectedListener spinnerListener= new Spinner.OnItemSelectedListener()
{
public void onItemSelected(AdapterView<?>adapterView, View v, int position, long id)
{
String string=adapterView.getSelectedItem().toString();
if(string.equals("很少運動或完全沒運動"))
{
a=(float) 1.2;
}
else if (string.equals("每週運動1到3次"))
{
a=(float)1.375;
}
else if (string.equals("每週運動3到5次"))
{
a=(float)1.55;
}
else if (string.equals("每週運動6到7次"))
{
a=(float)1.725;
}
else
{
a=(float)1.9;
}

}
public void onNothingSelected(AdapterView<?>adapterView)
{
Toast.makeText(Health.this, "You don't select something else", Toast.LENGTH_LONG).show();
}
};
//當user按下calculate按鈕 就執行內部的程式
public void Calculate(View v)
{
//取得user所填入的數字
float height = Float.parseFloat(Height.getText().toString());
float weight = Float.parseFloat(Weight.getText().toString());
int age=Integer.parseInt(Age.getText().toString());
//設定計算數字的格式
DecimalFormat nf = new DecimalFormat("0.00");
//如果user是男性 就以此公式計算
if(man)
{
double manresulta=(double)66+(13.8*weight)+(5.0*height)-(6.8*age);
double manresultb=a*manresulta;
//先將計算後的數字對應我設定的格式 接著將double轉成string 最後顯示出來
display.setText(String.valueOf(nf.format(manresultb)));
}
//如果user是女性 就以此公式計算
if(woman)
{
double womanresulta=(double)655+(9.6*weight)+(1.8*height)-(4.7*age);
double womanresultb=a*womanresulta;
display.setText(String.valueOf(nf.format(womanresultb)));
}

}
}

2010年6月14日 星期一

Android開發-RadioButton


此次程式主要是練習RadioButton的使用方法 並且同樣的使用Toast來顯示 來方便驗證是否正確的監聽到使用者的圈選
此次用RadioGroup將同性質的按鈕歸類為同一類 來達到兩個按鈕互斥(也就是二選一)

main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<RadioGroup
android:id="@+id/radiogroup"
android:layout_width="320px"
android:layout_height="430px"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_x="0px"
android:layout_y="2px"
>
<RadioButton
android:id="@+id/maleradio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Man"
>
</RadioButton>
<RadioButton
android:id="@+id/femaleradio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Woman"
>
</RadioButton>
</RadioGroup>
</AbsoluteLayout>

Radiobutton.java

package com.android.demo.radiobutton;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.Toast;

public class Radiobutton extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findview();
setlistener();

}
private RadioGroup myradiogroup;
private void findview()
{
myradiogroup=(RadioGroup)findViewById(R.id.radiogroup);
}
private void setlistener()
{
myradiogroup.setOnCheckedChangeListener(changeradio);
}
//監聽radiogroup裡面的radiobutton是否有被使用者圈選
private RadioGroup.OnCheckedChangeListener changeradio=new RadioGroup.OnCheckedChangeListener()
{
public void onCheckedChanged(RadioGroup group, int checkedId)
{
//透過id來辨認不同的radiobutton
switch(checkedId)
{
case R.id.maleradio:
Toast.makeText(Radiobutton.this,"You are a Man",Toast.LENGTH_LONG).show();
break;
case R.id.femaleradio:
Toast.makeText(Radiobutton.this,"You are a Woman",Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(Radiobutton.this,"Someting error",Toast.LENGTH_LONG).show();
}
}

};
}

2010年6月13日 星期日

Android開發-Checkbox


這次的程式主要是練習Checkbox的使用方法 並且同樣和上篇一樣 搭配Toast來顯示

main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<CheckBox
android:id="@+id/male"
android:layout_width="88px"
android:layout_height="wrap_content"
android:text="Man"
android:layout_x="50px"
android:layout_y="252px"
>
</CheckBox>
<CheckBox
android:id="@+id/female"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Woman"
android:layout_x="190px"
android:layout_y="252px"
>
</CheckBox>
</AbsoluteLayout>

Checkbox.java

package com.android.demo.checkbox;

import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;

public class Checkbox extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findview();
checkboxlistener();
}
private CheckBox malecheckbox;
private CheckBox femalecheckbox;
private void findview()
{
malecheckbox=(CheckBox)findViewById(R.id.male);
femalecheckbox=(CheckBox)findViewById(R.id.female);
}
//設定checkbox的listener
private void checkboxlistener()
{
malecheckbox.setOnCheckedChangeListener(listener);
femalecheckbox.setOnCheckedChangeListener(listener);
}
//監聽user 是否有選取
private CheckBox.OnCheckedChangeListener listener=new CheckBox.OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
//如果user按下Man
if(malecheckbox.isChecked()==true)
{
//則顯示字串You are Man
Toast.makeText(Checkbox.this,"You are a Man",Toast.LENGTH_LONG).show();
}
//如果user按下Woman
if(femalecheckbox.isChecked()==true)
{
//則顯示字串You are Woman
Toast.makeText(Checkbox.this,"You are a Woman",Toast.LENGTH_LONG).show();
}
}
};
}

Android開發-Spinner應用


此次的程式 主要是練習下拉式選單 並且搭配Toast來顯示
Toast 介面元件的作用是彈出一個訊息框,快速在螢幕上顯示一小段訊息
這次的程式會學習到
1.Spinner的用法
2.Toast

main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget29"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="120px"
android:layout_y="112px"
>
</Spinner>
</AbsoluteLayout>

Spinnertest.java

package com.demo.android.spinnertest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;


public class Spinnertest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findview();
//建立一個ArrayAdapter物件,並且存放下拉式選單的內容
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,new String[]{"Screen","Keyboard","Mouse"});
//設定Spinner的樣式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//設定adapter 將剛剛的下拉式選單內容 給這個widget
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(spinnerListener);

}

private void findview() {
spinner = (Spinner) findViewById(R.id.spinner);
}

private Spinner spinner;
//監聽下拉式選單 是否被選擇
private Spinner.OnItemSelectedListener spinnerListener= new Spinner.OnItemSelectedListener()
{
//如果被選擇
public void onItemSelected(AdapterView<?>adapterView, View v, int position, long id)
{
//利用Toast來顯示 Toast.LENGTH_LONG則表示 顯示時間長
//Spinnertest.this 則代表指向Spinnertest這個實例 若是寫成this則是指向OnItemSelectedListener這個實例
//最後用show()將Toast 元件顯示在螢幕上
Toast.makeText(Spinnertest.this, "You select"+adapterView.getSelectedItem().toString(), Toast.LENGTH_LONG).show();
}

//若是沒有選擇任何項目
public void onNothingSelected(AdapterView<?>adapterView)
{
Toast.makeText(Spinnertest.this, "You don't select anything", Toast.LENGTH_LONG).show();
}
};


}

2010年6月11日 星期五

Android開發-Debug_Logcat tool

有時編譯完程式之後 會發現明明沒錯誤 怎麼丟到模擬器 卻又有問題產生 此時可以使用Logcat來幫助你 解決bug 有找到一篇寫得不錯 也有圖文教學的網頁 可以參考

Logcat使用教學

Android開發-Handle UI Events_多個button

在Android裡面 是利用Event listener來取得使用者是否正在操作介面(例如按下按鈕、touch等)來給予適當的回應 此次程式 延續上次的bmi程式 新增加了reset按鈕 可以將所有欄位清空 並且將各功能分開寫 而之前程式是一個button對應一個listener 那麼多個button 就可能需要很多個listener? 此部份我有找到一個可行的方法可以簡化此情形 查到的資料是寫android 1.6之後 就有支援這種寫法

此次的程式會學到:
1.多個button如何對應同個listener(當然也可以對應不同listener)
2.解決可能需要很多listener的情形 讓程式能夠簡化

main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Button
android:id="@+id/reset"
android:layout_width="109px"
android:layout_height="wrap_content"
android:text="Reset"
android:layout_x="100px"
android:layout_y="362px"
//將按鈕指定對應的listener 按下此按鈕將會執行ClickHandler內的東西
android:onClick="ClickHandler"
>
</Button>
<Button
android:id="@+id/submit"
android:layout_width="108px"
android:layout_height="wrap_content"
android:text="Cal Bmi"
android:layout_x="100px"
android:layout_y="292px"
//將按鈕指定對應的listener 按下此按鈕將會執行ClickHandler內的東西
android:onClick="ClickHandler"
>
</Button>
<EditText
android:id="@+id/height"
android:layout_width="165px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="100px"
android:layout_y="22px"
>
</EditText>
<EditText
android:id="@+id/weight"
android:layout_width="167px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="100px"
android:layout_y="82px"
>
</EditText>
<TextView
android:id="@+id/result"
android:layout_width="166px"
android:layout_height="57px"
android:background="#ffff9933"
android:textColor="#ff666666"
android:layout_x="70px"
android:layout_y="152px"
>
</TextView>
<TextView
android:id="@+id/suggest"
android:layout_width="168px"
android:layout_height="50px"
android:background="#ffff9933"
android:layout_x="70px"
android:layout_y="222px"
>
</TextView>
<TextView
android:id="@+id/widget33"
android:layout_width="wrap_content"
android:layout_height="32px"
android:text="Height(cm)"
android:layout_x="20px"
android:layout_y="32px"
>
</TextView>
<TextView
android:id="@+id/widget34"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Weight(kg)"
android:layout_x="20px"
android:layout_y="102px"
>
</TextView>
</AbsoluteLayout>

Bmi.java

package com.demo.android.bmi;

import android.app.Activity;
import android.os.Bundle;
import java.text.DecimalFormat;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;



public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得view上的元件
findViews();
}
private EditText fieldheight;
private EditText fieldweight;
private TextView result;
private TextView fieldsuggest;

public void ClickHandler(View v)
{
//利用switch case 來區別不同的按鈕
switch(v.getId())
{
//若是按下submit button 就執行calculate
case R.id.submit:

calculate();
break;
//若是按下reset button 就執行reset
case R.id.reset:
reset();
break;

}
}
private void findViews()
{
fieldheight = (EditText)findViewById(R.id.height);
fieldweight = (EditText)findViewById(R.id.weight);
result = (TextView)findViewById(R.id.result);
fieldsuggest = (TextView)findViewById(R.id.suggest);
}
//清除所有欄位
private void reset()
{
fieldheight.setText("");
result.setText("");
fieldweight.setText("");
fieldsuggest.setText("");

}
private void calculate()
{
DecimalFormat nf = new DecimalFormat("0.00");
double height = Double.parseDouble(fieldheight.getText().toString())/100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
result.setText("Your BMI is "+nf.format(BMI));
if(BMI>25){
fieldsuggest.setText("太胖了 該減肥了!");
}else if(18.51 fieldsuggest.setText("人人稱羨的完美身材!");
}else{
fieldsuggest.setText("太瘦了多吃點!");
}
}
}

2010年6月2日 星期三

Android開發-BMI設計

首先要一個小觀念 Android將其應用程式的介面稱為View 而負責控制各種動作行為的程式 則稱為Activity
這次的程式 我是參考gasolin大的教學 逐一瞭解之後
實際跑過一次 並且將我瞭解的部分 再寫一次 用來驗證是否熟悉
其實看起來有點像iphone中的MVC架構 但實際此程式並非依照此架構寫成的
gasolin大之後也有改成MVC架構的寫法 明顯的可以看出較為簡潔易懂 剛好也能對應我在iphone中所學到的
main.xml的部分是用來寫介面的部分 但android並不是透過xml儲存介面到手機上 而是自動將 XML 描述檔轉換成資源檔案 而此檔案為R.java
此次的介面包括button,textview,edittext


main.xml

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<EditText
//利用這個識別符號來對應這個元件 之後我們在程式中可以透過R.id.hegiht來調用他
android:id="@+id/height"
android:layout_width="157px"
android:layout_height="wrap_content"
android:textSize="18sp"
//限制此元件內容只能輸入integer
android:numeric="integer"
android:layout_x="100px"
android:layout_y="22px"
>
</EditText>
<EditText
android:id="@+id/weight"
android:layout_width="158px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:numeric="integer"
android:layout_x="100px"
android:layout_y="102px"
>
</EditText>
<TextView
android:id="@+id/widget29"
android:layout_width="wrap_content"
android:layout_height="31px"
android:text="Height(cm)"
android:textSize="18sp"
android:layout_x="10px"
android:layout_y="32px"
>
</TextView>
<TextView
android:id="@+id/widget30"
android:layout_width="wrap_content"
android:layout_height="31px"
android:text="Weight(kg)"
android:textSize="18sp"
android:layout_x="10px"
android:layout_y="112px"
>
</TextView>
<Button
android:id="@+id/submit"
android:layout_width="121px"
android:layout_height="wrap_content"
android:text="Calculate BMI"
android:textSize="18sp"
android:layout_x="100px"
android:layout_y="322px"
>
</Button>
<TextView
android:id="@+id/suggest"
android:layout_width="173px"
android:layout_height="38px"
android:textColor="#ff000000"
android:background="#ffff9900"
android:textSize="16sp"
android:layout_x="70px"
android:layout_y="242px"
>
</TextView>
<TextView
android:id="@+id/result"
android:layout_width="172px"
android:layout_height="42px"
android:textColor="#ff000000"
android:background="#ffff9933"
android:textSize="16sp"
android:layout_x="70px"
android:layout_y="182px"
>
</TextView>
</AbsoluteLayout>

Bmi.java

package com.demo.android.bmi;

import android.app.Activity;
import android.os.Bundle;
import java.text.DecimalFormat;
import android.view.View;
//用來監聽user是否按下button
import android.view.View.OnClickListener;
//因為此程式用到button,edittext,textview 所以需要import以下
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;



public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//宣告一個button 對應至在xml裡面的submit
Button button = (Button)findViewById(R.id.submit);
//監聽user是否按下按鈕 若按下 則執行calcBMI function
button.setOnClickListener(calcBMI);

}
private OnClickListener calcBMI = new OnClickListener()
{
public void onClick(View v)
{
DecimalFormat nf = new DecimalFormat("0.00");
//從
height對應的元件中取得user所輸入的數值
EditText fieldheight = (EditText)findViewById(R.id.height);
EditText fieldweight = (EditText)findViewById(R.id.weight);
//將字串轉成double
double height = Double.parseDouble(fieldheight.getText().toString())/100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
//xml中的result所對應的元件
TextView result = (TextView)findViewById(R.id.result);
//在result所對應的元件中 顯示字串 並且是按照之前所設定的格式
result.setText("Your BMI is "+nf.format(BMI));

TextView fieldsuggest = (TextView)findViewById(R.id.suggest);
if(BMI>25){
fieldsuggest.setText("太胖了 該減肥了!");
}
else if(18.51<BMI&&BMI<24)
{
fieldsuggest.setText("人人稱羨的完美身材!");
}
else{
fieldsuggest.setText("太瘦了多吃點!");
}
}
};

}

2010年5月29日 星期六

Android開發-droiddraw

前陣子開發iphone 這次跳到android來開發 最不習慣的就是 android怎麼 沒有一個可以直接拖拉介面的東西 用的很不習慣 這次來介紹一個其他人所開發的程式 可以讓你直接藉由拖拉的方式 產生xml

首先先下載 http://code.google.com/p/droiddraw/下載之後解壓縮 執行exe檔
以下是執行畫面 你可以從右手邊 拖拉元件 到左邊 呈現在手機上的畫面

拖拉完畢之後 按下方Generate 將產生的xml 複製到 你的專案下的res->layout->main.xml下 就可以完成了 雖然很方便
不過還是建議 入門時 還是先學會用手輸入的方式 順便學習一下xml 這樣觀念比較清楚

Android開發-環境建置

作業系統:win7 x32

首先先下載
1.JDK
2.Eclipse (我是下載 Eclipse IDE for Java Developer)
接著將Eclipse解縮到C槽 (看你的喜好)
3.android sdk (android 2.2)
同樣的解壓縮到C槽(看你的喜好)

.設定環境變數
開啟控制台->系統->左邊進階系統設定->進階->環境變數
找到path變數 按編輯 打入以下C:\Program Files\Java\jre6\bin;C:\android_sdk\tools;
不過目前似乎可以不需要設定以上環境變數 如果有問題 再自行設定看看

.安裝 ADT 擴充套件

打開Eclipse 點上方help->install new software
按add 在Location這個地方 輸入以下網址:
http://dl-ssl.google.com/android/eclipse/site.xml
Name的欄位 我是填寫android
接著會花一些時間 找尋適合的版本
等下方出現Developer Tools 就全選 按next 最後安裝完成之後 按finish
安裝完成之後 他會要你重新啟動Eclipse

.設定Android SDK
打開Eclipse 選上方window->preference->左邊Android
接著在SDK Loaction的地方 選擇你剛剛解壓縮android sdk的路徑 因為我解壓縮到C曹 因此我設定成C:\android_sdk 選好之後 你會發現下方怎麼都沒東西!?正常來說應該會有東西 沒關係別擔心 接著進行以下步驟

.更新package
打開Eclipse 選上方window->Android SDK and AVD manager ->左手邊Installed Packages->update all->接著會列出很多需要安裝的package->選Accept all->按install
這邊的安裝會花一段時間 我的網路是偽光纖 都需要下載大約半小時以上 所以就耐心等待他安裝完成吧

.設定 Android 虛擬機器
打開Eclipse->選上方windows->Android SDK and AVD manager->左手邊virtual device->點右方new
接著會跳出一個選單 需要填入一些模擬器的資訊

name填入android(這邊看你的喜好)
Target 這邊我選android 2.2 (android模擬器相當強大 可以模擬很多硬體 像是要寫google map的相關應用 這邊要選Google APIS)
SD Card
Size 的地方 我填入1024
Skin的地方 我選built-in
Hardware的地方 就讓他保持原預設值

接著按Creat AVD

接著恭喜你 以上步驟 就可以將環境設定好了 可以開始開發android程式了 第一次跑模擬器的時候 需要花一些時間 當然cpu不能太爛 不然真的會花很多時間 筆者電腦
AMD AM2 4800+ 也跑了大概5分鐘左右(印象中)

以下提供一開始入門學習android的網站
1.深入淺出 Android -- Google 手持設備應用程式設計入門
2.Android 官方教學

2010年5月18日 星期二

iphone開發-UIImageView

在iPhone程式中,每個程式裡面會有唯一一個UIWindow這個View,剩下的所有的View都會包含在UIWindow中,因此每個View會產生階層的形式,一層蓋著一層

此次的程式可以學到:
1.如何用寫code的方式 將圖片用全螢幕的形式呈現在view上
2.如何將小圖片加入目前的view上
3.如何清除上一個View

test14ViewController.h


#import <UIKit/UIKit.h>

@interface test14ViewController : UIViewController {
UIImageView *myImage;
}
//讓myImage 可以使用dot syntax
@property(nonatomic,retain)UIImageView *myImage;
-(IBAction)addimage:(id)sender;
-(IBAction)reset:(id)sender;
-(void)image;

@end

test14ViewController.m

#import "test14ViewController.h"

@implementation test14ViewController

@synthesize myImage;


- (void)viewDidLoad {

[super viewDidLoad];
//讓圖片可以全螢幕
UIImageView *myView=[[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//指定圖片檔名
[myView setImage:[UIImage imageNamed:@"jokeman1.png"]];
//設定圖片的透明度 值為0.0~1.0(圖片隱藏~完全不隱藏)
[myView setAlpha:0.2];
//將myView加入到目前的view 蓋上去
[self.view addSubview:myView];

}
-(IBAction)addimage:(id)sender
{
[self image];
}

-(IBAction)reset:(id)sender
{
//[myImage setHidden:YES];(將myImage隱藏)
//將myImage移除
[myImage removeFromSuperview];


}

-(void)image
{
//前兩個座標指定圖片的顯示區域 後兩個設定圖片長寬
CGRect myImageRect = CGRectMake(130.0f, 150.0f, 64.0f, 71.0f);
myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"butterfly.png"]];
//加入到目前的view
[self.view addSubview:myImage];
[myImage release];
}


- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}


- (void)dealloc {
[super dealloc];
}

@end

2010年5月16日 星期日

iphone開發-Peer-to-Peer Connectivity used by Bluetooth

最近寫過wifi 也有看到怎麼用藍芽來建立雙方連線 順便記錄一下

GamekitTestViewController.h

#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>

@interface GameKitTestViewController :
//用GKPeerPickerControllerDelegate 協定
UIViewController <GKPeerPickerControllerDelegate,GKSessionDelegate>
{
GKPeerPickerController *mPicker;
GKSession *mSession;
IBOutlet UITextField *mTextField;
IBOutlet UITextView *mTextView;
NSMutableArray *mPeers;
}
-(IBAction) connectClicked:(id)sender;
-(IBAction) sendData:(id)sender;
@property (retain) GKSession *mSession;

@end

GameKitTestViewController.m

#import " GameKitTestViewController.h "

@implementation GameKitTestViewController

@synthesize mSession;

- (void)viewDidLoad {
[super viewDidLoad];

mPicker=[[GKPeerPickerController alloc] init];
mPicker.delegate=self;
//使用iphone內建介面 讓user選擇要wifi or bluetooh
//但這邊須注意一點是 iphone 藍芽的部分 會自動幫你建立雙方的連線 但是透過
wifi的話 就要自己寫 可以參考我前幾篇
mPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby | GKPeerPickerConnectionTypeOnline;
mPeers=[[NSMutableArray alloc] init];
//顯示週遭有哪些peer
[mPicker show];
}

//當user選擇哪種連線時 就會呼叫下列method
- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type{
if (type == GKPeerPickerConnectionTypeOnline) {
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
}
}
//當peer picker 需要session 就會呼叫此method 也就是準備session讓其他peer可以連進來
- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type{

NSString *txt=mTextField.text;
GKSession* session = [[GKSession alloc] initWithSessionID:@"test" displayName:txt sessionMode:GKSessionModePeer];
[session autorelease];
return session;
}

//當連線建立完成時 會呼叫此method
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{

NSLog(@"Connected from %@",peerID);

self.mSession = session;
session.delegate = self;
[session setDataReceiveHandler: self withContext:nil];
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
}

//這邊如同wifi 就不再敘述了
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{

switch (state)
{
case GKPeerStateConnected:
{
NSString *str=[NSString stringWithFormat:@"%@\n%@%@",mTextView.text,@"Connected from pier ",peerID];
mTextView.text= str;
NSLog(str);
[mPeers addObject:peerID];
break;
}
case GKPeerStateDisconnected:
{
[mPeers removeObject:peerID];

NSString *str=[NSString stringWithFormat:@"%@\n%@%@",mTextView.text,@"DisConnected from pier ",peerID];
mTextView.text= str;
NSLog(str);
break;
}
}
}

2010年5月15日 星期六

iphone開發-從一個class呼叫另一個class的method

假設有ClassA ClassB 我要在ClassB中 呼叫ClassA的method
可以用以下程式的寫法

ClassA.h

@interface ClassA:UIViewController{

}
-(int)calculate;

ClassA.m

@implementation ClassA

-(int)calculate
{
int x=5;
return x;
}

ClassB.h

@interface ClassB:UIViewController{

}
-(IBAction)test:(id)sender;

ClassB.m
//要import ClassA.h
#import " ClassA.h "
#import " ClassB.h "

@implementation ClassB
-(IBAction)test:(id)sender
{
int y;
//先alloc 再init 相當於Java中的new
//產生ClassA 的instance
ClassA *integer=[[ClassA alloc]init];
//這樣y值就會得到5
y=[integer calculate];
[integer release];

}

iphone開發-透過按鈕切換view

這次我將程式分開成兩個class來寫 順便練習怎麼各自呼叫對方的method 另外我這次設計了兩個xib 當一開始classA的xib載入後 我按下按鈕之後 程式能切換到class B的xib

test12ViewController.h

// forward declaration
@class Testcontroller;

@interface test12ViewController : UIViewController {

//另外一個class
Testcontroller *testcontroller;

}
//以下這樣寫 就可以使用dot syntax
@property(nonatomic,retain)Testcontroller *testcontroller;
//用來切換不同的view
-(IBAction)change:(id)sender;
-(int)display;


@end

test12ViewController.m

#import " test12ViewController.h "
//用Testcontroller產生一個instance object
#import " Testcontroller.h "

@implementation test12ViewController
@synthesize testcontroller;

-(IBAction)change:(id)sender
{
if (self.testcontroller==nil) {
//載入Testcontroller的xib
Testcontroller *testcontrollertemp=[[Testcontroller alloc]initWithNibName:@"Testcontroller" bundle:nil];
self.testcontroller=testcontrollertemp;

[testcontrollertemp release];
//加到原本的view上面
[self.view addSubview:testcontroller.view];

}
}
-(int)display
{
int x=5;
return x;
}

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}


- (void)dealloc {
[testcontroller release];
[super dealloc];
}

@end

testcontroller.m

#import " Testcontroller.h "
//必須記得import以下 因為要產生test12ViewController的instance
//若沒有加入這段 會出現 "XXX may not respond to class"
#import " test12ViewController.h "


@implementation Testcontroller
@synthesize display;






- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

-(IBAction)test:(id)sender
{
int y;
//產生test12ViewController的instance
test12ViewController *integer=[[test12ViewController alloc]init];
//透過這個instance 去呼叫test12ViewController的method
y=[integer display];
//將int轉換成字串
NSString *dispalytext=[[NSString alloc]initWithFormat:@"%d",y];
display.text=dispalytext;
[integer release];
[dispalytext release];

}
- (void)dealloc {
[super dealloc];
}


@end

2010年5月6日 星期四

iphone開發-Peer-to-Peer Connectivity used by Wifi

今天幫Lab的同學寫了一個程式 透過wifi 讓兩台iphone連線 然後讓其中一台播放音樂時 另外一台也能自動放出音樂
而這次程式主要是用到Gamekit API 還有Avaudioplayer

" test10ViewController.h"
//用Gamekit api前 要先import以下這行
#import <GameKit/GameKit.h>
#import <UIKit/UIKit.h>

//用GKSessionDelegate協定
@interface test10ViewController : UIViewController <GKSessionDelegate>
{
UILabel *display;
NSString *sessionID;
//產生GKsession 物件
GKSession *myGKSession;
NSString *peerList;
AVAudioPlayer *audioPlayer;
//存放物件的陣列
NSMutableArray *mPeers;

}
@property(nonatomic,retain)IBOutlet UILabel *display;


-(IBAction)play:(id)sender;
-(IBAction)stop:(id)sender;
-(void) setupSession;
- (void) destroySession;
-(void) disconnectCurrentCall;
-(void) sendData;

@end

" test10ViewController.m"

//在這邊先定義sessionID 兩台手機靠這個來辨識對方 所以雙方都要一樣
有點像在Java寫的UUID

#define sessionID @"connecttest"

- (void)viewDidLoad {
[super viewDidLoad];
//呼叫setupSession method
[self setupSession];
//指定音樂檔案的路徑
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio.mp3", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
//初始化陣列
mPeers=[[NSMutableArray alloc] init];
}
-(void)setupSession
{
//GKSessionModerPeer 表示此程式可當Server or Client 詳細的說明 請看Library
//初始化Session
myGKSession = [[GKSession alloc] initWithSessionID:sessionID displayName:nil sessionMode:GKSessionModePeer];

myGKSession.delegate = self;

[myGKSession setDataReceiveHandler:self withContext:nil];
//設定為YES 將服務發佈出去
myGKSession.available = YES;

}
-(IBAction)play:(id)sender
{
audioPlayer.currentTime = 0;
[audioPlayer play];
//按下播放按鈕之後 將字串傳出去
[self sendData];
}
-(IBAction)stop:(id)sender
{
[audioPlayer stop];
}
//此處可將字串傳送給對方 我這邊是用來讓另外一台手機判斷 何時放音樂之用
-(void) sendData
{
NSString *str=@"test";
[myGKSession sendData:[str dataUsingEncoding: NSASCIIStringEncoding] toPeers:mPeers withDataMode:GKSendDataReliable error:nil];

}
//當收到data時 呼叫此method
-(void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
{
NSString *str4 = @"test";
NSString* aStr;
aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
//判斷字串是否相同
if([str4 isEqualToString:aStr])
{
//相同就放音樂
[audioPlayer play];

}


}

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
switch (state) {
//發現服務時 會跳到此case
case GKPeerStateAvailable:
peerList=peerID;
display.text=[myGKSession displayNameForPeer:peerID];
//將peerID加到陣列中 用來傳送資料 要傳給哪個peer的紀錄之用
[mPeers addObject:peerID];
//連線到提供服務的peer
[myGKSession connectToPeer:peerID withTimeout:10.0];
break;

case GKPeerStateUnavailable:
peerList=nil;
display.text=@"No Service";
break;
case GKPeerStateDisconnected:


peerList=nil;

break;

case GKPeerStateConnecting:



break;
//連線之後 就會跳到此case
case GKPeerStateConnected:
display.text=@"Connect Sucessfully";
//切換到view2
[[NSBundle mainBundle]loadNibNamed:@"view2" owner:self options:NULL];
break;
default:

break;
}
//當有client請求連線 就會呼叫此method
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID
{
//接受此client的連線要求
[myGKSession acceptConnectionFromPeer:peerID error:nil];
}

PS:另外要記得加入Gamekit framework
程式以上就大致完成了

Game Kit programming Guide

2010年4月27日 星期二

iphone開發-UITouch

今天老師要我寫一個觸控螢幕 畫面就會顯示你觸控位置的座標的小程式
查了一下 剛好UITouch有提供locationInView 這個method 可以達到這個功能
只要在程式裡面加入此method
//當手觸摸螢幕時 就會自動跑到以下程式
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
//取得觸摸點
UITouch *touch = [touches anyObject];
// 取得觸摸點的座標
CGPoint pt = [touch locationInView:self.view];
//顯示(x,y)
NSString *locationMessage = [[NSString alloc] initWithFormat:@"座標: x=%.0f, y=%.0f", pt.x, pt.y];
//顯示在Label上
display.text=locationMessage;
[locationMessage release];
}

Library:
UITouch

2010年4月25日 星期日

iphone開發-G-Sensor 應用

最近花了一些時間寫一個 甩骰子遊戲 跟電腦比大小
透過此程式 會學到:
1.How to use UIImageView
2.圖片切換 形成的動畫
3.How to use Accelerometer
4.同個class裡 呼叫其他method

"test6ViewController.h"
//使用UIAccelerometerDelegate Protocol
@interface test6ViewController : UIViewController <UIAccelerometerDelegate>
{

UILabel *label;
UILabel *display;
UILabel *display2;

}

"test6ViewController.m"

//剛載入view時
- (void)viewDidLoad {
//取得加速計object給系統
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
//讓UIViewController取得代理
accelerometer.delegate = self;
//每1/60秒更新加速計的data
accelerometer.updateInterval = 1.0f/60.0f;
//呼叫同class's play method
[self play];
[super viewDidLoad];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
//shakeCount 計算搖晃次數
static NSInteger shakeCount=0;
//產生NSDate object
static NSDate *shakeStart;

NSDate *now=[[NSDate alloc] init];
//加兩秒到當前的時間
NSDate *checkDate=[[NSDate alloc] initWithTimeInterval:2.0f sinceDate:shakeStart];
//如果now大於checkdate 也就是超過兩秒
if ([now compare:checkDate]==NSOrderedDescending||shakeStart==nil){
//重新計算搖晃次數
shakeCount=0;
[shakeStart release];
shakeStart=[[NSDate alloc] init];
}

[now release];
[checkDate release];

//三軸搖晃的G力超過2就將搖晃次數加1 ps:fabsf:絕對值
if (fabsf(acceleration.x)>2.0 || fabsf(acceleration.y)>2.0|| fabsf(acceleration.z)>2.0){
shakeCount++;
//如果兩秒內搖晃次數大於4
if (shakeCount>4){
shakeCount=0;
[shakeStart release];
shakeStart=[[NSDate alloc] init];
//呼叫compare method
[self compare];


}
}
}
-(int)getRandomNumber:(int)from to:(int)to {
return (int)from + arc4random() % (to-from+1);

}


-(void)compare
{
//產生1~6隨機變數
int randomNumber = [self getRandomNumber:1 to:6];
//將圖片放到(x,y,w,h)=(130,150)的位置 原點為螢幕上左上角 w,h 為圖片的寬和高
CGRect myImageRect = CGRectMake(130.0f, 150.0f, 64.0f, 71.0f);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];
switch (randomNumber) {
case 1:
//將one.png設定為 要顯示的圖片
[myImage setImage:[UIImage imageNamed:@"one.png"]];
break;
case 2:
[myImage setImage:[UIImage imageNamed:@"two.png"]];
break;
case 3:
[myImage setImage:[UIImage imageNamed:@"three.png"]];
break;
case 4:
[myImage setImage:[UIImage imageNamed:@"four.png"]];
break;
case 5:
[myImage setImage:[UIImage imageNamed:@"five.png"]];
break;
case 6:
[myImage setImage:[UIImage imageNamed:@"six.png"]];
break;
default:
break;
}
//處理電腦的骰子點數
int randomNumber2=[self getRandomNumber:1 to:6];
NSString* Text = [[NSString alloc] initWithFormat:@"%d", randomNumber2];
NSString* Text1=@"電腦骰出";
NSString* ConText = [NSString stringWithFormat:@"%@%@", Text1,Text];
display2.text=ConText;

//你骰出的點數比電腦大 就勝利
if (randomNumber>randomNumber2) {
display.text=@"You Win!";
}
//平手
else if(randomNumber==randomNumber2)

{
display.text=@"drawn game";
}
//其餘就是你輸
else {
display.text=@"Sorry,You Lose!";
}

myImage.opaque = YES;
[self.view addSubview:myImage];
[myImage release];
}
//開始搖晃前 產生骰子動畫
-(void)play
{
CGRect myImageRect = CGRectMake(130.0f, 150.0f, 64.0f, 71.0f);
//將6個點數的骰子圖片 分別放入array
UIImageView *fishAni = [[UIImageView alloc] initWithFrame:myImageRect];
fishAni.animationImages=[NSArray arrayWithObjects:
[UIImage imageNamed:@"one.png"],[UIImage imageNamed:@"two.png"],[UIImage imageNamed:@"three.png"],[UIImage imageNamed:@"four.png"],[UIImage imageNamed:@"five.png"],[UIImage imageNamed:@"six.png"],nil ];
//設定動畫播放時間
fishAni.animationDuration=6.0;
//設定重複播放次數,0 為不斷重複
fishAni.animationRepeatCount=0;

//開始撥放動畫
[fishAni startAnimating];

//將ImageView 加入到目前view的subview
[self.view addSubview:fishAni];
}


@end

Library:
UIAccelerometer
NSDate
UIImageView

2010年4月19日 星期一

iphone開發-字串連接

在java裡面我們常常用到"+"來連接兩個字串 但在objective c似乎不是這樣用
以下用一個例子解釋
float weight=benefit2/7700;
//將float轉成string
NSString* Text = [[NSString alloc] initWithFormat:@"%f", weight];
NSString* Text1=@"你會瘦";
NSString* Text2=@"kg";
//將三個字串連結在一起
NSString *ConText = [NSString stringWithFormat:@"%@%@%@", Text1,Text, Text2];

iphone開發-UISlider

這幾天寫了一個可以計算你一天吃多少熱量之後 一個月後會瘦幾公斤 或變胖
有用到UISlider 剛好拿來記錄一下
"MyViewController.h"

@interface MyViewController : UIViewController {
UITextField *textfield;
UITextField *textfield2;
UITextField *textfield3;
UITextField *textfield4;
UILabel *display;
UILabel *display2;
//產生一個UISlider object
UISlider *slider;
NSString *string;
NSString *string2;
NSString *string3;
NSString *string4;
}
@property(nonatomic,retain)IBOutlet UITextField *textfield;
@property(nonatomic,retain)IBOutlet UITextField *textfield2;
@property(nonatomic,retain)IBOutlet UITextField *textfield3;
@property(nonatomic,retain)IBOutlet UITextField *textfield4;
//告訴IB有一個UISlider
@property(nonatomic,retain)IBOutlet UISlider *slider;
@property(nonatomic,retain)IBOutlet UILabel *display;
@property(nonatomic,retain)IBOutlet UILabel *display2;
@property(nonatomic,copy)NSString *string;
@property(nonatomic,copy)NSString *string2;
@property(nonatomic,copy)NSString *string3;
@property(nonatomic,copy)NSString *string4;

-(IBAction)calculate:(id)sender;
-(IBAction)reset:(id)sender;
//對應UISlider的event
-(IBAction)sliderChanged:(id)sender;
-(IBAction)female:(id)sender;
-(IBAction)male:(id)sender;

@end

"MyViewController.m"

@implementation MyViewController

@synthesize textfield;
@synthesize textfield2;
@synthesize textfield3;
@synthesize textfield4;
@synthesize slider;
@synthesize display;
@synthesize display2;
@synthesize string;
@synthesize string2;
@synthesize string3;
@synthesize string4;

float a;
int characterselect;
//移動slider的event
-(IBAction)sliderChanged:(id)sender
{
NSString *newText;
UISlider *slider=(UISlider *)sender;
//先在IB裡面設定範圍 此處我設定為0~4 user移動slider之後 就會是0~4其中一個
int progressAsInt=(int)(slider.value+0.5f);
switch (progressAsInt) {
case 0:
{
newText=@"很少運動或完全沒運動";
a=1.2;
break;
}
case 1:
{
newText=@"每周運動1-3次";
a=1.375;
break;
}
case 2:
{
newText=@"每周運動3-5次";
a=1.55;
break;
}
case 3:
{
newText=@"每周運動6-7次";
a=1.725;
break;
}
case 4:
{
newText=@"每天非常重度的運動或體力勞動者";
a=1.9;
break;
}
default:
newText=@"exception error";
break;
}
//在diplay2這個label顯示字串
display2.text=newText;
[newText release];
}

-(IBAction)calculate:(id)sender
{

self.string=textfield.text;
self.string2=textfield2.text;
self.string3=textfield3.text;
self.string4=textfield4.text;
//將字串轉成int
int stringint=[string intValue];
int stringint2=[string2 intValue];
int stringint3=[string3 intValue];
int stringint4=[string4 intValue];
if (characterselect==0) {
//基礎代謝率公式
float kg=9.6*stringint2;
float cm=1.8*stringint;
float age=4.7*stringint3;
float benefit=655+kg+cm-age;
float result=a*benefit;
float result2=result-stringint4;
if (result2<0) {
display.text=@"只會變胖不會變瘦";
}
if (result2==0) {
display.text=@"不會變胖也不會變瘦";
}
if(result2>0)
{
float benefit2=result2*30;
float weight=benefit2/7700;
NSString* Text = [[NSString alloc] initWithFormat:@"%f", weight];
NSString* Text1=@"你會瘦";
NSString* Text2=@"kg";
//字串結合
NSString *ConText = [NSString stringWithFormat:@"%@%@%@", Text1,Text, Text2];
display.text=ConText;
[Text release];
}
}
if (characterselect==1) {

float kg=13.8*stringint2;
float cm=5.0*stringint;
float age=6.8*stringint3;
float benefit=66+kg+cm-age;
float result=a*benefit;
//浮點數轉成字串
//NSString* myNewString = [[NSString alloc] initWithFormat:@"%f", a];
//display.text=myNewString;
float result2=result-stringint4;
if (result2<0) {
display.text=@"只會變胖不會變瘦";
}
if (result2==0) {
display.text=@"不會變胖也不會變瘦";
}
if(result2>0)
{
float benefit2=result2*30;
float weight=benefit2/7700;
NSString* Text = [[NSString alloc] initWithFormat:@"%f", weight];
NSString* Text1=@"你會瘦";
NSString* Text2=@"kg";
//字串結合
NSString *ConText = [NSString stringWithFormat:@"%@%@%@", Text1,Text, Text2];
display.text=ConText;
[Text release];
}
}

}
//按鈕按下去會觸發的event
-(IBAction)female:(id)sender
{
characterselect=0;
}
-(IBAction)male:(id)sender
{
characterselect=1;
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{

[textfield resignFirstResponder];
[textfield2 resignFirstResponder];
[textfield3 resignFirstResponder];
[textfield4 resignFirstResponder];

return YES;
}
-(IBAction)reset:(id)sender
{
textfield.text=@"";
textfield2.text=@"";
textfield3.text=@"";
textfield4.text=@"";
display.text=@"";
display2.text=@"";

}

- (void)dealloc {
[textfield release];
[textfield2 release];
[textfield3 release];
[string release];
[string2 release];
[string3 release];
[display release];
[slider release];
[super dealloc];
}


@end

2010年4月16日 星期五

iphone開發-AVAudioPlayer

前幾天 我寫了一個陽春版的吹風機程式(意思就是打開按鈕 會有吹風機的聲音)是一個無裡頭的程式XD 這次的程式其實是延續上篇的UISwitch 加入播放音樂的功能 而iphone裡面 有一個AVAudioplayer可以直接用來播放音樂用 以下就用我前幾天寫的程式來說明
"AudioPlayerViewController.h"

#import <UIKit/UIKit.h>
//記得先import 以下這個 才能使用AVAudioplayer
#import <AVFoundation/AVFoundation.h>

@interface AudioPlayerViewController : UIViewController {
//產生AVAudioPlayer object
AVAudioPlayer *audioPlayer;
//產生UISwitch object
UISwitch *switched;
}
@property(nonatomic,retain)IBOutlet UISwitch *switched;
-(IBAction)switchange:(id)sender;

@end

"AudioPlayerViewController.m"

#import "AudioPlayerViewController.h"

@implementation AudioPlayerViewController
@synthesize switched;

-(IBAction)switchange:(id)sender
{
UISwitch *whichswitch=(UISwitch *)sender;
//當switch的按鈕切換到ON
if (whichswitch.isOn==YES) {
//讓audioPlayer可以重頭播放
audioPlayer.currentTime = 0;
//開始播放
[audioPlayer play];
}
else
//停止播放 但不會讓音樂重頭播放
[audioPlayer stop];


}


//程式剛起始時 會運作的部分
- (void)viewDidLoad {
[super viewDidLoad];

//指定音樂檔名和格式
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio.mp3", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

}
- (void)dealloc {
//記得釋放記憶體
[audioPlayer release];
[super dealloc];
}

@end

最後記得 點xcode旁邊有個Resources 右鍵 add->existing files
選擇你想播放的音樂 記得將"copy items into destination group...."打勾 按add就可以了

另外還有一些其他method 像是

// 0.0 - no volume; 1.0 full volume

audioPlayer.volume = 0.5; 
//暫停
[audioPlayer pause];



2010年4月11日 星期日

iphone開發-UISwitch

前幾天看到老師給我看的刮鬍刀程式 我也想來寫一個無厘頭的程式 因此我想寫一個吹風機程式XD 在iphone裡面 有一個像開關的按鈕 稱作UISwitch 在這邊紀錄一下 UISwitch 怎麼使用 我用我前幾天寫的程式 來教學
首先在.h 檔 做以下宣告

"test4AppDelegate.h"

@interface test4AppDelegate : NSObject {
UIWindow *window;
UILabel *display;
//產生一個 switch object
UISwitch *switchchange;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic,retain)IBOutlet UISwitch *switchchange;
@property(nonatomic,retain)IBOutlet UILabel *display;
-(IBAction)switchchanged:(id)sender;

@end


"
test4AppDelegate.m"

@implementation test4AppDelegate

@synthesize window;
@synthesize switchchange;
@synthesize display;


//這邊控制按鈕的動作
-(IBAction)switchchanged:(id)sender
{
UISwitch *whichswitch=(UISwitch *)sender;
//當按鈕移動到ON 就印出test的字串
if (whichswitch.isOn==YES) {
display.text=@"test";

}
//當移動到Off 就印出test2
else
display.text=@"test2";


}


- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Override point for customization after application launch
[window makeKeyAndVisible];
}

- (void)dealloc {
[window release];
[super dealloc];

}


@end

2010年4月9日 星期五

iphone開發-型別轉換

// 將字串轉換成int
NSString *intString = @"1";
int value = [intString intValue];

// 將字串轉換成float
NSString *floatString = @"10.00";
float value = [floatString floatValue];

// 將字串轉換成double
NSString *doubleString = @"10.000000";
double value = [doubleString doubleValue];

//將float轉換成字串

float weight=benefit2/7700;
NSString* Text = [[NSString alloc] initWithFormat:@"%f", weight];

//釋放記憶體

[Text release];

//將int轉換成字串

int weight=5;

NSString* Text = [[NSString alloc] initWithFormat:@"%d", weight];

//釋放記憶體

[Text release];

iphone開發-object與method寫法

在objective C中 我們常可以看到[receiver message]的東西 以下將介紹這個
譬如說 我們產生一個label object
UILabel *label
我們想在label中顯示一段字串 我們可以這麼寫
[label setText:@"This is a test"];
@開頭表示是一串字串 接著用雙引號括號起來
其實它也可以寫成像java 用dot的寫法 這兩個是一樣的
label.text=@"This is a test";
也就是object.method

2010年4月8日 星期四

iphone開發-dismiss the keyboard

今天花了蠻多時間在解決這個問題 在iphone中輸入文字or數字 他會自動彈出虛擬鍵盤 但是輸入完成後 按下return or done(要看你在UI中 設定成什麼) 並不會自動消失 因此需要自行加入某樣東西才行 以下用我今天寫的東西來介紹
(MyViewController.h)
//UIVewController 使用UITextFieldDelegate這個protocol 這樣才能用到使鍵盤消失的method
@interface MyViewController : UIViewController <UITextFieldDelegate> {
//產生一個可以在上面輸入文字的object
UITextField *textField;
UITextField *textField2;
//產生一個label object
UILabel *label;
NSString *string;
NSString *string2;

}
//用IBOulet作為UI的識別
@property (nonatomic,retain)IBOutlet UITextField *textField;
@property (nonatomic,retain)IBOutlet UITextField *textField2;
@property (nonatomic,retain)IBOutlet UILabel *label;
@property (nonatomic,copy)NSString *string;
@property (nonatomic,copy)NSString *string2;
//按鈕宣告
-(IBAction)calculate:(id)sender;
@end

(MyViewController.m)
#import "MyViewController.h"


@implementation MyViewController

@synthesize textField;
@synthesize textField2;
@synthesize label;
@synthesize string;
@synthesize string2;

//按鈕按下要執行的事件
-(IBAction)calculate:(id)sender
{
//將user輸入的文字 放到string中
self.string=textField.text;
self.string2=textField2.text;
float bmi;
float hight;
//string 轉換成 float (ps:這邊我會另外再簡介)
float stringFloat = [string floatValue];
hight=stringFloat/100;
float stringFloat2 = [string2 floatValue];
float hight2=hight*hight;
bmi=stringFloat2/hight2;

if (bmi<18.5) text="@">=18.5&&bmi<24) text="@">=24&&bmi<27) text="@">=27)
{
label.text=@"太胖了..沒救了";
}
}
//這邊就是當user按下虛擬鍵盤的return or done之後 會呼叫此function 接著鍵盤會自動消失
-(Bool)textFieldShouldReturn:(UITextField *)TextField
{
//因為我有兩個textField (也就是可以讓使用者輸入文字的地方)
[textField resignFirstResponder];
[textField2 resignFirstResponder];
return YES;
}

之後就是記得在UI設計那邊 要將兩個textField 連到file's owner 讓file's owner當作代理程式

2010年4月6日 星期二

iphone開發-declare and define(2)

接續上篇所介紹的 今天剛好用到隨機函數 拿這個例子來當作舉例
首先在.h的檔案中 加入下列這行來宣告這個method
-(int)getRandomNumber:(int)from to:(int)to;
接著在.m的檔案中 加入下列這行來定義,也就是告訴他要做些什麼事
-(int)getRandomNumber:(int)from to:(int)to {
//這邊的用法 和C裡面的srand()一樣
return (int)from + arc4random() % (to-from+1);

}

之後在.m裡面 可以加入下列這行來呼叫這個method
//隨機產生1~10
int randomNumber = [self getRandomNumber:1 to:10];



2010年4月1日 星期四

iphone開發-declare and define篇

今天終於把objective c++ K過一遍了 將一些心得寫上來 順便記住一些重點
在開發時 當我新建立一個專案時 我們會看到 XXX.h 和XXX.m 兩個檔案
事實上 開發iphone時 我們會發現 他們將不同功能 不同作用的程式碼 分出來 寫到不同的檔案上
我們先來介紹一下 .h 和.m 主要是在做什麼
"XXX.h" 其實就像是C++ header一樣 在裡面宣告類別以及變數 而objective c++稱作
interface

"XXX.m" 在objective c++裡面稱作implement的部份 也就是定義 該類別要作什麼動作

範例如下:
EX: XXX.h
#import 

@interface Fraction: NSObject {
int numerator;
int denominator;
}

-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end

EX:XXX.m
#import "Fraction.h"
#import

@implementation Fraction
-(void) print {
printf( "%i/%i", numerator, denominator );
}

-(void) setNumerator: (int) n {
numerator = n;
}

-(void) setDenominator: (int) d {
denominator = d;
}

-(int) denominator {
return denominator;
}

-(int) numerator {
return numerator;
}
@end









2010年3月18日 星期四

iphone實機開發-程式 免簽證(idp)上傳到iphone執行

試了兩天終於成功了 先簡介一下開發環境(有空再附圖上去)
mac os :snow leopard 10.6.2
iphone sdk:3.1.2
xcode: 3.2.1
iphone os:3.1.2

以上Xcode iphone sdk和mac os的版本要相同 否則方法會不同

首先iphone 需要兩個動作(必備):
1.blackra1n(JB)
2.透過cydia下載 Appsync for 3.1
詳細安裝過程請看 網站 (已經JB完 請從第四步驟開始) 之後等有空再附上圖片

以上前置動作完成之後 接下來就是重頭戲了 開始之前 先把你的iphone插上電腦
1.到你的mac os 接著看到工作列 按前往->電腦->你灌os的硬碟->Developer->SDks
->iPhoneOS3.1.2.sdk (對應你要開發的版本 做相同的修改)
把裡面的SDKSettings.plist拉到桌面 然後按右鍵以Dashcode打開 然候找到
CODE_SIGNING_REQUIRED 把它的string值 改成No 存檔之後 拉回去覆蓋即可

2.在xcode左上角先選 Device-3.1.2 Release(看你的iphone os版本 選擇相對應的版本)

3. 接著到Xcode裡面 對著你的project 按右鍵 選Get info 之後buide這欄中 找到Code Signing Identity 將 Code Singing Identity 和 Any iPhone OS Device 都選成Don't code sign即可
(每個新的project 都要設定一次)

4.接著按Build and Run 你就會看到程式上傳到iphone了

若要移除程式 請在xcode的工具列 按windows->organizer 找到下方 application
選你要移除的程式 按下方的"-" 就可以移除了

2010年3月7日 星期日

iphone開發-開發環境建置

下載Xcode for iPhone and Mac Development 為你的mac 裝Xocde 和 iphone sdk吧

根據你的os版本來下載 是免費下載的 但是需要先註冊

下載玩安裝之後 恭喜你 就可以開始開發了

開發之前 我們先來看官方的 Tutorial

非官方的


中文的objective c++ 教學

推薦書籍:
iPhone Developer's Cookbook Building Applications with the iPhone SDK



iphone開發-系統建置

要開發iphone程式 有以下幾種方法
1. PearPC
類似模擬器的方式開發 缺點我覺得效能不太好 會有點頓 雖然據說最新的一版 有比之前快了
實際試過之後發現10.5之後的版本都無法安裝 由於PearPc之後都沒繼續維護更新 而iphone sdk又必須在mac os 10.5之後才能開發 因此此方法就失效 若有看到新版 會再過來更新

2.cygwin 開發平台(windows版 iPhone SDK)
有人最近做出來的整合工具 但是缺點是 不像在Xcode上開發一樣 可以直接先在模擬器上測試 必須要直接上傳到iphone上面 進行測試

3.用Vmware
效能也是不好 不建議
目前沒有成功過
今天看到此篇教學 正要測試看看 會再上來更新狀況

4.直接用原生mac(推薦)
不過因為我也會用到windows 因此我採用的方法是 用雙系統(非bootcamp)
目前的作法 是用win7+mac 但有點運氣 如果你用到的mac 版本 剛好不適合你的硬體 那就要 多試試看幾個版本囉 我用在Asus的主機板 成功安裝 但是顯示晶片的驅動 沒有成功

啟動時 按F8打-v 若沒有成功 可以嘗試 輸入cpus=1 -v 接著按enter裝裝看(此方式 是強制mac 用單核心安裝)





2010年2月20日 星期六

中和到關渡宮路線

查了一下 從中和到關渡宮 有兩種走法
1.台64 五股一下 接著接關渡大橋
2.從洲美快速道路下大度路

去程:
這次我選擇2的走法 因為跟台64不熟 囧 下次再走走看
上洲美快速道路 第一個出口是 承德路 再來就是 大度路 跟大業路 要從大度路下來
下來大度路一段->二段->三段 會上一個小橋 接著要靠到左邊 準備左轉接 中央北路4段
走右邊關渡宮->直走接知行路->左手邊會看到關渡宮->準備右轉進停車場

回程:
從知行路出來->接中央北路4段->左轉之後 靠到右邊 右轉接大度路三段 靠到內線一直直走 就可以看到上洲美快速道路的閘道上去 走到底會有兩個出口 一個是往環河北路(左) 一個是往社子(右)
要往中和 走環河北路 接著接環河快速道路 再接華中橋 就到我家了

2010年2月11日 星期四

碩士生涯結束

一顆懸在心中的大石頭終於放下了 如果沒有老師的耐心指導 北鼻的鼓勵和打氣 還有夥伴們的幫忙 我想我的論文至今仍無法完成 也許沒有寫的很好 但是我已經做了最大的努力了 盡可能的把論文寫好 到現在心情還是無法平復 久久不能自己(其實是誇飾法XD) 我終於畢業了! 碩士的生涯結束了 這段時間我覺得我過得很充實 學了很多東西 不管是程式的能力 論文的寫作和研究 我想我是有進步的 寫作真的蠻難的 修改了很多次 才到比較能看的版本 人機互動其實是一個非常難的學問 因為必須考量使用者的感受與需求 我們不能因為覺得這功能很炫 就沒來由的去寫 結果就造成使用者根本就沒用到 又或者改變他們原有的使用習慣 就像老闆說的 我們要做為資工系的設計師!設計之前要先考量到使用者的需求(雖然目前業界..都是上面的要你做啥就做啥 很難能有自已的想法 這就是為什麼台灣的軟體一直都無法媲美國外的其中一個原因吧= =) 雖然人生中的其中一個挑戰已經結束 但是未來一定會有更多更難的挑戰 還是要隨時準備迎接下一個挑戰!

2010年1月26日 星期二

壓力好大..

論文不停的改...一直改的不好 壓力非常的大
甚至有時候會有個念頭 想要休學了 但我知道 我不能這樣做
父母花了很多錢 很多心力培養我長大
很擔心無法畢業...擔心出來的時候 都已經老了 找工作沒人要
還有家裡沈重的貸款要負責償還 現在的我想要趕快當完兵
趕快找到穩定的工作 幫忙家裡分擔一些家計

2010年1月3日 星期日

解決Gmail error

最近使用了chrome dev版,結果開啟gmail卻產生了錯誤,大致是"Gamil的部份功能出現了錯誤"等訊息 方法是 按chrome右上角的板手->選項->個人化設定頁面->清除瀏覽資料->清除瀏覽紀錄和清空快取 這兩個打勾接著按清除 重開chrome之後 就會恢復正常