`
lyunabc
  • 浏览: 551575 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Android简明开发教程十四:Context Menu 绘制几何图形

 
阅读更多

上下文相关菜单(Context Menu)类同PC上按鼠标右键显示的菜单,在Android平台上是长按来激活Context Menu,Context Menu一般用来显示和当前UI内容相关的菜单。

Context Menu的用法和Option Menu非常类似:

首先是创建菜单资源,在res/menu 下新建menu_context_shape.xml,用来显示Oval,Pear,Shape2D:

<?xml version=”1.0″ encoding=”utf-8″?>
<menu
xmlns:android=”http://schemas.android.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>

展开Context Menu,是通过onCreateContextMenu 方法:

1
2
3
4
5
6
7
@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);
}

处理Context Menu事件:

1
2
3
4
5
6
7
8
@Override
public boolean onContextItemSelected(MenuItem item) {
menuOption = item.getItemId();
drawImage();
return super.onContextItemSelected(item);
}

为了在长按时能在View上显示Context Menu,需要为View注册Context Menu:

1
2
3
4
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerForContextMenu(graphic2dView);
}

完整代码如下:

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

菜单除了这里介绍的功能外,Android也支持动态菜单或动态修改菜单。具体可以参见Android 文档。

分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程四:3D 坐标变换

    在Android平台进行3D图形开发时,OpenGL ES(Open Graphics Library for Embedded Systems)是一项关键的技术。它允许开发者在移动设备上创建复杂的3D图形和动画。在OpenGL ES的环境中,3D坐标变换是构建和操作3D...

    Android简明开发教程二十四篇及示例代码下载.pdf

    《Android简明开发教程》是一份详尽的指南,旨在帮助初学者和有经验的开发者快速掌握Android应用开发。这份教程共分为二十四篇,涵盖了Android开发的基础到高级主题,包括安装Android SDK、创建第一个应用程序、理解...

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    android开发教程CHM

    《Android开发教程CHM》是一本专为Android开发者设计的详尽指南,旨在帮助初学者和有经验的开发者深入理解Android平台的各个方面。这个CHM(Microsoft Compiled HTML Help)文件包含了大量的信息,使得学习和查阅...

    Android 开发 简明教程 中文版

    【Android开发简明教程中文版】是一份专为初学者设计的详细教程,旨在帮助学习者快速掌握Android应用开发的基本技能。这份资料由经验丰富的教师编写,内容全面且深入浅出,适合对移动开发感兴趣的开发者或者在校学生...

    Android OpenGL ES 简明开发教程相关源码真正的3D图形

    Android OpenGL ES 简明开发真正的3D图 Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.microedition.khronos.opengles ,java.nio 等几个包中

    Android OpenGL ES 简明开发教程相关源码添加颜色

    Android OpenGL ES 简明开发教程相关源码添加颜色 简单的上色方法叫做顶点着色(Vertxt coloring),可以使用单色,也可以定义颜色渐变或者使用材质(类同于二维图形中各种Brush类型)。

    Android_OpenGL_ES_简明开发教程

    这个简明开发教程主要参考了Jayway Team Blog中关于OpenGL ES开发的教程,该教程比较通俗易懂,非常适合OpenGL ES的初学者。教程主要通过示例和步骤讲解,旨在帮助没有3D开发经验的程序员快速入门。并且,由于很多...

    Android OpenGL ES 简明开发教程相关源码材质渲染

    这个“Android OpenGL ES 简明开发教程相关源码材质渲染”旨在教授如何在Android应用中利用OpenGL ES进行材质渲染,从而创建出丰富的视觉效果。 材质渲染是OpenGL ES中的关键概念,它涉及到物体表面的外观属性,如...

    计算机图形学简明教程

    实验可能包括使用OpenGL、DirectX或WebGL等图形库创建基本的几何形状、实现图形变换、绘制复杂的场景,以及实现简单的动画效果。 3. **复习重点**:复习资料通常会突出课程中的关键点,比如图形渲染管线(从顶点到...

    autocad2010简明教程

    ### AutoCAD2010简明教程知识点梳理 #### 第1课 计算机绘图技术概述 **本课要点**: 1. **计算机绘图技术简介**:介绍计算机绘图的基本概念和技术背景。 2. **现有计算机绘图技术**:概述当前主流的计算机绘图技术...

    计算机图形学简明教程实验指导

    张彩明教授的《计算机图形学简明教程》是这门领域的一本重要教材,旨在为学习者提供清晰易懂的理论基础和实践指导。实验部分是理解和掌握计算机图形学的关键,因为它使理论知识得以应用并直观地展现出来。 本实验...

    计算机图形学简明教程课件

    《计算机图形学简明教程》是山东大学计算机学院张彩明教授编著的一本教材,其配套课件为学习者提供了丰富的视觉辅助资料,帮助理解复杂的概念。 课件内容可能涵盖了以下几个关键知识点: 1. **基础理论**:计算机...

    计算机图形学简明教程习题答案

    张彩明教授的《计算机图形学简明教程》是一本深入浅出介绍这个主题的教材,而配套的习题答案则为学习者提供了检验理解和实践的宝贵资源。 计算机图形学涉及多个知识点,包括: 1. **基础概念**:理解基本的图形...

    Web前端开发简明教程.pdf

    Web前端开发简明教程.pdf

    计算机图形学简明教程课后习题答案

    ### 计算机图形学简明教程课后习题答案解析 #### 第二章知识点解析 **2.1 计算机图形系统的主要功能** 计算机图形系统是用于生成、处理和显示图形信息的一种综合系统。它主要包括以下几种关键功能: 1. **计算...

    AndroidAPP开发入门教程.pdf

    本教程主要介绍了Android APP开发的基本步骤,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,为读者提供了一个简明的Android APP开发入门教程。 一、准备工作 在开始Android APP开发之前,需要准备...

    AndroidOpenGLES简明开发教程.pdf

    AndroidOpenGLES简明开发教程.pdf

Global site tag (gtag.js) - Google Analytics