blog

Android Development Quick and Concise Tutorials 14 : コンテキストメニューの図形描画

コンテキスト関連のメニューは、マウスの右ボタンを押して表示されるPCのメニューに似ていますが、Androidプラットフォーム上で、コンテキストメニューをアクティブにするには長押しですコンテキストメニュ...

Jul 9, 2025 · 14 min. read
シェア

コンテキスト関連メニューは、PCでマウスの右ボタンを押して表示されるメニューと似ていますが、Androidプラットフォームでは長押しでコンテキストメニューを起動し、一般的に現在のUIコンテンツに関連するメニューを表示するために使用されます。

コンテキストメニューの使い方は、オプションメニューとよく似ています:

<?xml version=”1.0  encoding=”utf-8″?> 
<menu 
  xmlns:android=”http://..com/apk/res/android > 
<item 
   android:id=”@+id/mnuOval” 
   android:title=”Oval”> 
</item> 
<item 
    android:id=”@+id/mnuPear” 
    android:title=”Pear”> 
</item> 
<item 
    android:id=”@+id/mnuShape2DDemo” 
    android:title=”Shape2D”> 
</item> 
</menu> 

コンテキストメニューの展開はonCreateContextMenuメソッドで行います:

@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_context_shape, menu); 
    } 

コンテキストメニューイベントを処理します:

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
     menuOption = item.getItemId(); 
     drawImage(); 
     return super.onContextItemSelected(item);    
    } 

ビューを長押ししたときにコンテキストメニューを表示するには、ビューにコンテキストメニューを登録する必要があります:

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     registerForContextMenu(graphic2dView); 
    } 

全コードは以下の通り:

1   public class Shape extends Graphics2DActivity { 
2     
3    private int menuOption; 
4     
5    public void onCreate(Bundle savedInstanceState) { 
6     super.onCreate(savedInstanceState); 
7     registerForContextMenu(graphic2dView); 
8    } 
9     
10   @Override 
11   protected void drawImage() { 
12    switch (menuOption) { 
13    case R.id.mnuOval: 
14     drawOval(); 
15     break; 
16    case R.id.mnuPear: 
17     drawPear(); 
18     break; 
19    case R.id.mnuShape2DDemo: 
20     drawShape2D(); 
21     break; 
22    default: 
23     drawOval(); 
24     break; 
25    } 
26    graphic2dView.refreshCanvas(); 
27    
28   } 
29    
30   @Override 
31   public void onCreateContextMenu(ContextMenu menu, View v, 
32     ContextMenuInfo menuInfo) { 
33    super.onCreateContextMenu(menu, v, menuInfo); 
34    MenuInflater inflater = getMenuInflater(); 
35    inflater.inflate(R.menu.menu_context_shape, menu); 
36   } 
37    
38   @Override 
39   public boolean onContextItemSelected(MenuItem item) { 
40    
41    menuOption = item.getItemId(); 
42    drawImage(); 
43    return super.onContextItemSelected(item); 
44    
45   } 
46    
47   private void drawOval() { 
48    AffineTransform mat1; 
49    
50    /** Colors */ 
51    Color redColor = new Color(0x96ff0000, true); 
52    Color greenColor = new Color(0xff00ff00); 
53    mat1 = new AffineTransform(); 
54    mat1.translate(30, 40); 
55    mat1.rotate(-30 * Math.PI / 180.0); 
56    // Clear the canvas with white color. 
57    graphics2D.clear(Color.WHITE); 
58    graphics2D.Reset(); 
59    
60    graphics2D.setAffineTransform(new AffineTransform()); 
61    SolidBrush brush = new SolidBrush(greenColor); 
62    graphics2D.fillOval(brush, 20, 60, 100, 50); 
63    
64    com.mapdigit.drawing.Pen pen 
65       = new com.mapdigit.drawing.Pen(redColor, 5); 
66    graphics2D.setAffineTransform(mat1); 
67    graphics2D.drawOval(pen, 20, 60, 100, 50); 
68   } 
69    
70   private void drawPear() { 
71    Ellipse circle, oval, leaf, stem; 
72    Area circ, ov, leaf1, leaf2, st1, st2; 
73    circle = new Ellipse(); 
74    oval = new Ellipse(); 
75    leaf = new Ellipse(); 
76    stem = new Ellipse(); 
77    circ = new Area(circle); 
78    ov = new Area(oval); 
79    leaf1 = new Area(leaf); 
80    leaf2 = new Area(leaf); 
81    st1 = new Area(stem); 
82    st2 = new Area(stem); 
83    graphics2D.clear(Color.WHITE); 
84    graphics2D.Reset(); 
85    int w = SharedGraphics2DInstance.CANVAS_WIDTH; 
86    int h = SharedGraphics2DInstance.CANVAS_HEIGHT; 
87    int ew = w / 2; 
88    int eh = h / 2; 
89    SolidBrush brush = new SolidBrush(Color.GREEN); 
90    graphics2D.setDefaultBrush(brush); 
91    // Creates the first leaf by filling the 
92    //intersection of two Area 
93    // objects created from an ellipse. 
94    leaf.setFrame(ew - 16, eh - 29, 15, 15); 
95    leaf1 = new Area(leaf); 
96    leaf.setFrame(ew - 14, eh - 47, 30, 30); 
97    leaf2 = new Area(leaf); 
98    leaf1.intersect(leaf2); 
99    graphics2D.fill(null, leaf1); 
100   
101   // Creates the second leaf. 
102   leaf.setFrame(ew + 1, eh - 29, 15, 15); 
103   leaf1 = new Area(leaf); 
104   leaf2.intersect(leaf1); 
105   graphics2D.fill(null, leaf2); 
106   
107   brush = new SolidBrush(Color.BLACK); 
108   graphics2D.setDefaultBrush(brush); 
109   
110   // Creates the stem by filling the Area 
111   //resulting from the subtraction of two 
112   //Area objects created from an ellipse. 
113   stem.setFrame(ew, eh - 42, 40, 40); 
114   st1 = new Area(stem); 
115   stem.setFrame(ew + 3, eh - 47, 50, 50); 
116   st2 = new Area(stem); 
117   st1.subtract(st2); 
118   graphics2D.fill(null, st1); 
119   
120   brush = new SolidBrush(Color.YELLOW); 
121   graphics2D.setDefaultBrush(brush); 
122   
123   // Creates the pear itself by filling the 
124   //Area resulting from the union of two Area 
125   //objects created by two different ellipses. 
126   circle.setFrame(ew - 25, eh, 50, 50); 
127   oval.setFrame(ew - 19, eh - 20, 40, 70); 
128   circ = new Area(circle); 
129   ov = new Area(oval); 
130   circ.add(ov); 
131   graphics2D.fill(null, circ); 
132  } 
133   
134  private void drawShape2D() { 
135   Color bg = Color.white; 
136   Color fg = Color.black; 
137   Color red = Color.red; 
138   Color white = Color.white; 
139   com.mapdigit.drawing.Pen pen 
140      = new com.mapdigit.drawing.Pen(fg, 1); 
141   SolidBrush brush = new SolidBrush(red); 
142   // Clear the canvas with white color. 
143   graphics2D.clear(bg); 
144   graphics2D.Reset(); 
145   Dimension d = new Dimension(SharedGraphics2DInstance.CANVAS_WIDTH, 
146     SharedGraphics2DInstance.CANVAS_HEIGHT); 
147   int gridWidth = d.width / 2; 
148   int gridHeight = d.height / 6; 
149   
150   int x = 5; 
151   int y = 7; 
152   int rectWidth = gridWidth - 2 * x; 
153   int stringY = gridHeight - 3 - 2 - 16; 
154   int rectHeight = stringY - y - 2; 
155   graphics2D.draw(pen, new Line(x, y + rectHeight - 1, 
156     x + rectWidth, y)); 
157   x += gridWidth; 
158   graphics2D.draw(pen, new Rectangle(x, y, rectWidth, 
159     rectHeight)); 
160   x += gridWidth; 
161   x = 5; 
162   y += gridHeight; 
163   stringY += gridHeight; 
164   graphics2D.draw(pen, new RoundRectangle(x, y, rectWidth, 
165     rectHeight, 
166     10, 10)); 
167   x += gridWidth; 
168   graphics2D.draw(pen, new Arc(x, y, rectWidth, 
169     rectHeight, 90, 135, 
170     Arc.OPEN)); 
171   x = 5; 
172   y += gridHeight; 
173   stringY += gridHeight; 
174   graphics2D.draw(pen, new Ellipse(x, y, rectWidth, 
175     rectHeight)); 
176   x += gridWidth; 
177   // draw GeneralPath (polygon) 
178   int x1Points[] = { x, x + rectWidth, x, 
179     x + rectWidth }; 
180   int y1Points[] = { y, y + rectHeight, 
181     y + rectHeight, y }; 
182   com.mapdigit.drawing.geometry.Path polygon 
183     = new com.mapdigit.drawing.geometry.Path( 
184     com.mapdigit.drawing.geometry.Path.WIND_EVEN_ODD, 
185     x1Points.length); 
186   polygon.moveTo(x1Points[0], y1Points[0]); 
187   for (int index = 1; index < x1Points.length; index++) { 
188    polygon.lineTo(x1Points[index], y1Points[index]); 
189   } 
190   polygon.closePath(); 
191   graphics2D.draw(pen, polygon); 
192   x = 5; 
193   y += gridHeight; 
194   stringY += gridHeight; 
195   int x2Points[] = { x, x + rectWidth, x, x + rectWidth }; 
196   int y2Points[] = { y, y + rectHeight, y + rectHeight, y }; 
197   com.mapdigit.drawing.geometry.Path polyline 
198     = new com.mapdigit.drawing.geometry.Path( 
199     com.mapdigit.drawing.geometry.Path.WIND_EVEN_ODD, 
200     x2Points.length); 
201   polyline.moveTo(x2Points[0], y2Points[0]); 
202   for (int index = 1; index < x2Points.length; index++) { 
203    polyline.lineTo(x2Points[index], y2Points[index]); 
204   } 
205   graphics2D.draw(pen, polyline); 
206   x += gridWidth; 
207   graphics2D.setPenAndBrush(pen, brush); 
208   graphics2D.fill(null, 
209     new Rectangle(x, y, rectWidth, rectHeight)); 
210   graphics2D.draw(null, 
211     new Rectangle(x, y, rectWidth, rectHeight)); 
212   x = 5; 
213   y += gridHeight; 
214   stringY += gridHeight; 
215   Color[] colors = new Color[] { red, white }; 
216   int[] fractions = new int[] { 0, 255 }; 
217   LinearGradientBrush redtowhite 
218       = new LinearGradientBrush(x, y, x 
219     + rectWidth, y, fractions, colors, 
220     com.mapdigit.drawing.Brush.NO_CYCLE); 
221   graphics2D.setPenAndBrush(pen, redtowhite); 
222   graphics2D.fill(null, new RoundRectangle(x, y, rectWidth, 
223     rectHeight, 
224     10, 10)); 
225   graphics2D.draw(null, new RoundRectangle(x, y, rectWidth, 
226     rectHeight, 
227     10, 10)); 
228   x += gridWidth; 
229   graphics2D.setPenAndBrush(pen, brush); 
230   graphics2D.fill(null, new Arc(x, y, rectWidth, 
231     rectHeight, 90, 135, 
232     Arc.CHORD)); 
233   graphics2D.draw(null, new Arc(x, y, rectWidth, 
234     rectHeight, 90, 135, 
235     Arc.CHORD)); 
236   x = 5; 
237   y += gridHeight; 
238   stringY += gridHeight; 
239   int x3Points[] = { x, x + rectWidth, x, x + rectWidth }; 
240   int y3Points[] = { y, y + rectHeight, y + rectHeight, y }; 
241   com.mapdigit.drawing.geometry.Path filledPolygon 
242   = new com.mapdigit.drawing.geometry.Path( 
243     com.mapdigit.drawing.geometry.Path.WIND_EVEN_ODD, 
244     x3Points.length); 
245   filledPolygon.moveTo(x3Points[0], y3Points[0]); 
246   for (int index = 1; index < x3Points.length; index++) { 
247    filledPolygon.lineTo(x3Points[index], y3Points[index]); 
248   } 
249   filledPolygon.closePath(); 
250   graphics2D.setPenAndBrush(pen, brush); 
251   graphics2D.fill(null, filledPolygon); 
252   graphics2D.draw(null, filledPolygon); 
253   
254  } 
255 } 

メニュー ここで説明した機能に加えて、Androidは動的メニューや動的に変更されるメニューもサポートしています。詳しくはAndroidのドキュメントを参照してください。

Read next

Networker遠隔操作画面録画ソフトのヒント

画面を読み取るNetworkerソフトウェア\nインストール\n\nをダブルクリックしてプログラムを起動し、"設定 "オプションをクリックしてパラメータを設定し、"監視の開始 "と "バックグラウンド実行 "をクリックします。監視開始 "と "バックグラウンド実行 "をクリックして監視を開始します。\n\n自動画面録画ソフトオープン\n使用上のアドバイス\nバックグラウンド動作」にチェックを入れることをお勧めします。

Jul 9, 2025 · 2 min read