在我的Android 2.2.2设备上,图库非常好看。我想在自己的应用程序中做的是按一个按钮,然后显示如下所示的菜单:
这是使用任何标准的Android主题/样式吗?有没有人知道有这样一个菜单的示例代码?
编辑: 我发现可以使用Dialog来模仿这个菜单。为了简化这个例子,我在这个例子中没有使用ListView,只是对话框的一个TextView条目:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#FFF"
android:padding="10dp"
/>
</LinearLayout>
按下按钮时显示对话框:
Dialog dialog = new Dialog(MyActivity.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Test option 1");
WindowManager.LayoutParams WMLP = dialog.getWindow().getAttributes();
WMLP.gravity = (Gravity.BOTTOM | Gravity.LEFT);
WMLP.x = 0;
WMLP.y = 0;
dialog.getWindow().setAttributes(WMLP);
dialog.show();
这会创建一个靠近图片菜单的对话框。不过我还有两个问题:
1)如何在对话框底部绘制这个小三角形,如上图所示?
2)应该打开对话框的按钮水平放置在底部按钮栏的中间。因此,当我按下它时,对话框应显示在该按钮的正上方。 我想做的是:
WMLP.x = middleButton.getLeft() + (middleButton.getWidth() / 2) - dialog.getWindow().getDecorView().getPaddingLeft() - (WMLP.width / 2);
问题是,WMLP.width是-2。我想原因是布局宽度设置为“wrap_content”(即-2),此时不知道实际宽度。 那么,我如何确定对话框的宽度,以便我可以将它同心放在另一个视图上?
更新:我终于找到了这样一个对话框的很棒的来源: http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/
这正是我想要的,我现在正在我的应用程序中使用它。
答案 0 :(得分:1)
您可以通过在当前位置添加PopupWindow来实现此目的,为了绘制这个很酷的菜单,您需要获得此背景的图像以及绘制的litle箭头。
此外,您应该阅读有关Nine-Path Drawable的内容。
PS:我已经完成了这项工作,但还有其他形象。
答案 1 :(得分:0)
3个选项:
关于绘制三角形(实际上,我认为它是一个正方形,圆角被对角线分割)。我将创建后面的大方块(对话框的容器)和另一个将成为此三角形的方块(使用图像)。这会产生一些透明度问题,因为三角形会与正方形部分重叠。所以也许三角形不会透明。
另一种选择是使用自定义视图。我从来没有试过这个,但我认为你可以指定一组点并抚摸它们创建白框。内部可以是具有透明度(易于)的彩绘矩形。你的画家对象(用于绘制文本,线条,矩形的东西)有一些阴影,但我相信这将是使用手动绘图功能实现的最复杂的事情。
使用来源! (换句话说,Android是开放的......看看他们是如何在源代码中做到的)
你什么时候试着获得价值?如果你在onCreate方法中执行它,它应该不起作用。当用户单击按钮时执行此操作。如果你这次已经这样做了,我无法帮助你。它应该工作。我以前做过很多次了!
免费提示:使用view.getLocationOnScreen是一个更好的选择,而不是view.getLeft(返回到其父级的距离)。
答案 2 :(得分:0)
这可能是,或者至少可以使用PathShape
构造实现的。结合ShapeDrawable
,您可以构建自己的“对话框”控件。使用相同的路径,您可以定义图形{{3}}的剪切区域。最后,使用Canvas
,您可以使用透明颜色填充画布。