引路蜂二維圖形畫筆(Pen)樣本含有四個樣本,Lines ,Dashes ,LineJoin 和LineCap。打算採用Option Menu(主菜單) 的方式來選擇不同樣本。
首先要對GuidebeeGraphics2DView,和Graphics2DActivity做些改動,從這個樣本開始,GuidebeeGraphics2DView需要動態 繪製不同圖形(可以通過菜單,或是Thread)。在GuidebeeGraphics2DView增加下面兩個方法:
final Runnable updateCanvas = new Runnable() {
public void run() {
invalidate();
}
};
public void refreshCanvas(){
post(updateCanvas);
}
post可以用在非UI Thread中Call UI Thread中方法。這裡只是觸發螢幕重繪事件以重新整理螢幕顯示。
在Graphics2DActivity增加一個變數protected GuidebeeGraphics2DView graphic2dView; 來獲得對應的 GuidebeeGraphics2DView執行個體。
graphic2dView=(GuidebeeGraphics2DView)findViewById(R.id.graphics2dview);
使用Option Menu,儘管也可以完全使用代碼來建立菜單,更一般的方法是使用菜單資源。在res 下建立menu 子目錄,然後 在res/menu下建立menu_option_line.xml 用來顯示Pen的四個樣本選項:
<?xml version=”1.0″ encoding=”utf-8″?>
<menu
xmlns:android=”http://schemas.android.com/apk/res/android“>
<item
android:id=”@+id/mnuLines”
android:title=”Lines”
android:icon=”@drawable/icon1″>
</item>
<item
android:id=”@+id/mnuDashes”
android:title=”Dashes”
android:icon=”@drawable/icon2″>
</item>
<item
android:id=”@+id/mnuLineCap”
android:title=”LineCap”
android:icon=”@drawable/icon3″>
</item>
<item
android:id=”@+id/mnuLineJoin”
android:title=”LineJoin”
android:icon=”@drawable/icon4″>
</item>
</menu>
<menu></menu> 定義菜單,<item></item>定義功能表項目,<item></item>可以嵌套以 定義子功能表。菜單可以定義id, Icon,Text等屬性。也可以支援單選,多選,此時就需要藉助<group></group>,使 用group可以把一最功能表項目定義為一個組,可以使用setGroupVisible()來顯示隱藏整個菜單組,Enable 或是Disable整個菜單組 setGroupEnabled()等。最關鍵的,有了組才能實現菜單的單選和多選功能:
<?xml version=”1.0″ encoding=”utf-8″?>
<menu xmlns:android=”http://schemas.android.com/apk/res/android“>
<item android:id=”@+id/item1″
android:icon=”@drawable/item1″
android:title=”@string/item1″ />
<!– menu group –>
<group android:id=”@+id/group1″>
<item android:id=”@+id/groupItem1″
android:title=”@string/groupItem1″ />
<item android:id=”@+id/groupItem2″
android:title=”@string/groupItem2″ />
</group>
</menu>
定義好菜單資源後,就可以使用MenuInflater.inflate()展開菜單,一般需要在Activity的onCreateOptionsMenu()展開菜單 :
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_option_line, menu);
return true;
}
最後是響應菜單事件:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
menuOption = item.getItemId();
drawImage();
return true;
}
item.getItemId(); 返回菜單的ID(在菜單資源中定義)。