Android開發(fā)速成簡潔教程十三:Option Menu畫筆示例
引路蜂二維圖形畫筆(Pen)示例含有四個(gè)示例,Lines ,Dashes ,LineJoin 和LineCap。打算采用Option Menu(主菜單)的方式來選擇不同示例。
首先要對(duì)GuidebeeGraphics2DView,和Graphics2DActivity做些改動(dòng),從這個(gè)示例開 始,GuidebeeGraphics2DView需要?jiǎng)討B(tài)繪制不同圖形(可以通過菜單,或是Thread)。在 GuidebeeGraphics2DView增加下面兩個(gè)方法:
- final Runnable updateCanvas = new Runnable() {
 - public void run() {
 - invalidate();
 - }
 - };
 - public void refreshCanvas(){
 - post(updateCanvas);
 - }
 
post可以用在非UI Thread中Call UI Thread中方法。這里只是觸發(fā)屏幕重繪事件以刷新屏幕顯示。
在Graphics2DActivity增加一個(gè)變量protected GuidebeeGraphics2DView graphic2dView; 來獲得對(duì)應(yīng)的GuidebeeGraphics2DView實(shí)例。
graphic2dView=(GuidebeeGraphics2DView)findViewById(R.id.graphics2dview);
使用Option Menu,盡管也可以完全使用代碼來創(chuàng)建菜單,更一般的方法是使用菜單資源。在res 下創(chuàng)建menu 子目錄,然后在res\menu下創(chuàng)建menu_option_line.xml 用來顯示Pen的四個(gè)示例選項(xiàng):
- <?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>定義菜單項(xiàng),<item></item>可以嵌套以定義子菜單。 菜單可以定義id, Icon,Text等屬性。也可以支持單選,多選,此時(shí)就需要借助<group></group>,使用group可以把一最菜 單項(xiàng)定義為一個(gè)組,可以使用setGroupVisible()來顯示隱藏整個(gè)菜單組,Enable 或是Disable整個(gè)菜單組setGroupEnabled()等。最關(guān)鍵的,有了組才能實(shí)現(xiàn)菜單的單選和多選功能:
- <?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;
 - }
 
最后是響應(yīng)菜單事件:
- @Override
 - public boolean onOptionsItemSelected(MenuItem item) {
 - menuOption = item.getItemId();
 - drawImage();
 - return true;
 - }
 
item.getItemId(); 返回菜單的ID(在菜單資源中定義)。
完整代碼如下:
- 1 public class Pen extends Graphics2DActivity {
 - 2
 - 3 int menuOption;
 - 4
 - 5 @Override
 - 6 protected void drawImage() {
 - 7 switch (menuOption) {
 - 8 case R.id.mnuLines:
 - 9 drawLines();
 - 10 break;
 - 11
 - 12 case R.id.mnuDashes:
 - 13 drawDash();
 - 14 break;
 - 15
 - 16 case R.id.mnuLineCap:
 - 17 drawLineCap();
 - 18 break;
 - 19
 - 20 case R.id.mnuLineJoin:
 - 21 drawLineJoin();
 - 22 break;
 - 23 default:
 - 24 drawLines();
 - 25 break;
 - 26
 - 27 }
 - 28 graphic2dView.refreshCanvas();
 - 29
 - 30 }
 - 31
 - 32 @Override
 - 33 public boolean onCreateOptionsMenu(Menu menu) {
 - 34 MenuInflater inflater = getMenuInflater();
 - 35 inflater.inflate(R.menu.menu_option_line, menu);
 - 36 return true;
 - 37 }
 - 38
 - 39 @Override
 - 40 public boolean onOptionsItemSelected(MenuItem item) {
 - 41 menuOption = item.getItemId();
 - 42 drawImage();
 - 43 return true;
 - 44 }
 - 45
 - 46 private void drawLineJoin() {
 - 47 Color blackColor = new Color(0xff000000);
 - 48 Color whiteColor = new Color(0xffffffff);
 - 49
 - 50 com.mapdigit.drawing.geometry.Path path
 - 51 = new com.mapdigit.drawing.geometry.Path();
 - 52 path.moveTo(40, 60);
 - 53 path.lineTo(90, 20);
 - 54 path.lineTo(140, 60);
 - 55 // Clear the canvas with white color.
 - 56 graphics2D.clear(Color.WHITE);
 - 57
 - 58 AffineTransform matrix = new AffineTransform();
 - 59 graphics2D.setAffineTransform(matrix);
 - 60 com.mapdigit.drawing.Pen pen
 - 61 = new com.mapdigit.drawing.Pen(blackColor,
 - 62 20, com.mapdigit.drawing.Pen.CAP_BUTT,
 - 63 com.mapdigit.drawing.Pen.JOIN_MITER);
 - 64 graphics2D.draw(pen, path);
 - 65 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 66 graphics2D.draw(pen, path);
 - 67
 - 68 matrix.translate(0, 50);
 - 69 graphics2D.setAffineTransform(matrix);
 - 70
 - 71 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 72 com.mapdigit.drawing.Pen.CAP_BUTT,
 - 73 com.mapdigit.drawing.Pen.JOIN_ROUND);
 - 74 graphics2D.draw(pen, path);
 - 75 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 76 graphics2D.draw(pen, path);
 - 77
 - 78 matrix = new AffineTransform();
 - 79 matrix.translate(0, 100);
 - 80 graphics2D.setAffineTransform(matrix);
 - 81
 - 82 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 83 com.mapdigit.drawing.Pen.CAP_BUTT,
 - 84 com.mapdigit.drawing.Pen.JOIN_BEVEL);
 - 85 graphics2D.draw(pen, path);
 - 86 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 87 graphics2D.draw(pen, path);
 - 88
 - 89 }
 - 90
 - 91 private void drawLineCap() {
 - 92 Color blackColor = new Color(0xff000000);
 - 93 Color whiteColor = new Color(0xffffffff);
 - 94 // Clear the canvas with white color.
 - 95 graphics2D.clear(Color.WHITE);
 - 96 AffineTransform matrix = new AffineTransform();
 - 97 graphics2D.setAffineTransform(matrix);
 - 98
 - 99 com.mapdigit.drawing.Pen pen
 - 100 = new com.mapdigit.drawing.Pen(blackColor,
 - 101 20, com.mapdigit.drawing.Pen.CAP_BUTT,
 - 102 com.mapdigit.drawing.Pen.JOIN_MITER);
 - 103 graphics2D.drawLine(pen, 40, 60, 140, 60);
 - 104 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 105 graphics2D.drawLine(pen, 40, 60, 140, 60);
 - 106
 - 107 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 108 com.mapdigit.drawing.Pen.CAP_ROUND,
 - 109 com.mapdigit.drawing.Pen.JOIN_MITER);
 - 110 graphics2D.drawLine(pen, 40, 100, 140, 100);
 - 111 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 112 graphics2D.drawLine(pen, 40, 100, 140, 100);
 - 113
 - 114 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 115 com.mapdigit.drawing.Pen.CAP_SQUARE,
 - 116 com.mapdigit.drawing.Pen.JOIN_MITER);
 - 117 graphics2D.drawLine(pen, 40, 140, 140, 140);
 - 118 pen = new com.mapdigit.drawing.Pen(whiteColor, 1);
 - 119 graphics2D.drawLine(pen, 40, 140, 140, 140);
 - 120 }
 - 121
 - 122 private void drawLines() {
 - 123 Color greenColor = new Color(0xff00ff00);
 - 124 // Clear the canvas with white color.
 - 125 graphics2D.clear(Color.WHITE);
 - 126 AffineTransform matrix = new AffineTransform();
 - 127 graphics2D.setAffineTransform(matrix);
 - 128
 - 129 com.mapdigit.drawing.Pen pen
 - 130 = new com.mapdigit.drawing.Pen(greenColor,1);
 - 131 graphics2D.drawLine(pen, 20, 150, 60, 50);
 - 132
 - 133 pen = new com.mapdigit.drawing.Pen(greenColor, 2);
 - 134 graphics2D.drawLine(pen, 40, 150, 80, 50);
 - 135
 - 136 pen = new com.mapdigit.drawing.Pen(greenColor, 3);
 - 137 graphics2D.drawLine(pen, 60, 150, 100, 50);
 - 138
 - 139 pen = new com.mapdigit.drawing.Pen(greenColor, 5);
 - 140 graphics2D.drawLine(pen, 80, 150, 120, 50);
 - 141
 - 142 pen = new com.mapdigit.drawing.Pen(greenColor, 7);
 - 143 graphics2D.drawLine(pen, 100, 150, 140, 50);
 - 144
 - 145 pen = new com.mapdigit.drawing.Pen(greenColor, 10);
 - 146 graphics2D.drawLine(pen, 120, 150, 160, 50);
 - 147
 - 148 }
 - 149
 - 150 private void drawDash() {
 - 151 Color blackColor = new Color(0xff000000);
 - 152 int dashArray1[] = { 2, 2 };
 - 153 int dashArray2[] = { 6, 6 };
 - 154 int dashArray3[] = { 4, 1, 2, 1, 1, 6 };
 - 155 // Clear the canvas with white color.
 - 156 graphics2D.clear(Color.WHITE);
 - 157 AffineTransform matrix = new AffineTransform();
 - 158 graphics2D.setAffineTransform(matrix);
 - 159
 - 160 com.mapdigit.drawing.Pen pen
 - 161 = new com.mapdigit.drawing.Pen(blackColor,
 - 162 20, com.mapdigit.drawing.Pen.CAP_BUTT,
 - 163 com.mapdigit.drawing.Pen.JOIN_MITER, dashArray1, 0);
 - 164 graphics2D.drawLine(pen, 40, 60, 140, 60);
 - 165
 - 166 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 167 com.mapdigit.drawing.Pen.CAP_BUTT,
 - 168 com.mapdigit.drawing.Pen.JOIN_MITER, dashArray2, 0);
 - 169 graphics2D.drawLine(pen, 40, 100, 140, 100);
 - 170
 - 171 pen = new com.mapdigit.drawing.Pen(blackColor, 20,
 - 172 com.mapdigit.drawing.Pen.CAP_BUTT,
 - 173 com.mapdigit.drawing.Pen.JOIN_MITER, dashArray3, 0);
 - 174 graphics2D.drawLine(pen, 40, 140, 140, 140);
 - 175 }
 - 176 }
 
















 
 
 
 
 
 
 