一、listpop(1)
listpop是一种Android中的控件,用于实现列表的弹出框效果。它可以显示出一个列表,选项可以点击并反馈给应用程序。listpop(1)代表的是由点击一个按钮或者文本的方式触发该控件的使用。
在使用listpop(1)时,首先需要在布局文件中声明一个按钮或者文本,并设置其点击事件。在点击事件里面,实例化一个Listpop对象,然后设置需要显示的选项内容,并显示列表弹出框。下面是一个示例代码:
Button btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Listpop listpop = new Listpop(MainActivity.this); listpop.setItems(new String[]{"选项一", "选项二", "选项三"}); listpop.show(); } });
在这个示例代码中,我们首先通过findViewById获得了一个按钮的实例,并设置其点击事件。在点击事件中,我们实例化了一个listpop对象,并通过setItems方法设置了需要显示的选项内容,最后调用show方法显示弹出框。
二、listpopupwindow
listpopupwindow是Android中的一个弹出框控件,与listpop的效果类似,但是更加灵活,可以在指定的位置弹出,并且可以自定义弹出框的大小和样式。使用listpopupwindow需要熟悉其中的一些方法和属性。
首先需要实例化一个ListPopupWindow对象,然后通过setAdapter方法设置适配器。适配器中的getView方法负责将每一个选项展示出来。ListPopupWindow对象提供了一系列的方法,可以设置以下属性:
1、setAnchorView:设置弹出框的参考控件。
2、setDropDownGravity:设置弹出框的位置,如Gravity.CENTER等,可以通过计算实现自定义位置。
3、setListSelector:设置选中状态的背景颜色。
4、setDropDownHeight:设置弹出框的高度。
下面是一个示例代码:
ListPopupWindow listPopupWindow = new ListPopupWindow(MainActivity.this); listPopupWindow.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, new String[]{"选项一", "选项二", "选项三"})); listPopupWindow.setAnchorView(findViewById(R.id.textView)); listPopupWindow.setDropDownGravity(Gravity.START); listPopupWindow.setListSelector(new ColorDrawable(getResources().getColor(R.color.colorAccent))); listPopupWindow.setDropDownHeight(getResources().getDimensionPixelSize(R.dimen.listPopHeight)); listPopupWindow.show();
三、listpopfront
listpopfront是listpopupwindow的一种补充,它可以使弹出框前面显示一个类似三角形的小图标。这个小图标可以增加弹出框的美观度和可读性,让用户更加容易选择需要的选项。
使用listpopfront需要自定义一个drawable,并将其设置给listpopupwindow的属性。listpopfront的drawable由三个部分组成,分别是左边的三角形、中间的线条和右边的半圆,需要在XML中定义。
下面是一个listpopfront的示例代码:
int width = getResources().getDimensionPixelSize(R.dimen.listPopWidth); int height = getResources().getDimensionPixelSize(R.dimen.listPopHeight); ListPopupWindow listPopupWindow = new ListPopupWindow(MainActivity.this); listPopupWindow.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, new String[]{"选项一", "选项二", "选项三"})); listPopupWindow.setAnchorView(findViewById(R.id.textView)); listPopupWindow.setWidth(width); listPopupWindow.setHeight(height); Drawable drawable = getResources().getDrawable(R.drawable.listpop_front); listPopupWindow.setBackgroundDrawable(drawable); listPopupWindow.show();
四、listpopupwindow位置
listpopupwindow的位置可以通过setDropDownGravity来设置,但是有时候需要根据其所在的父控件和弹出框的大小来计算位置,以实现更加灵活的布局。下面是一个计算位置的示例代码:
ListPopupWindow listPopupWindow = new ListPopupWindow(MainActivity.this); listPopupWindow.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, new String[]{"选项一", "选项二", "选项三"})); listPopupWindow.setAnchorView(findViewById(R.id.textView)); listPopupWindow.setWidth(getResources().getDimensionPixelSize(R.dimen.listPopWidth)); listPopupWindow.setHeight(getResources().getDimensionPixelSize(R.dimen.listPopHeight)); listPopupWindow.setListSelector(new ColorDrawable(getResources().getColor(R.color.colorAccent))); listPopupWindow.setDropDownGravity(Gravity.START); listPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); listPopupWindow.show(); int[] location = new int[2]; findViewById(R.id.textView).getLocationOnScreen(location); DisplayMetrics dm = getResources().getDisplayMetrics(); int screenHeight = dm.heightPixels; int screenWidth = dm.widthPixels; if (screenHeight - location[1] - getResources().getDimensionPixelSize(R.dimen.listPopHeight) >= 0) { listPopupWindow.setVerticalOffset(location[1] + findViewById(R.id.textView).getHeight()); } else { listPopupWindow.setVerticalOffset(location[1] - getResources().getDimensionPixelSize(R.dimen.listPopHeight)); listPopupWindow.setDropDownGravity(Gravity.START|Gravity.TOP); } int leftMargin = location[0] - (getResources().getDimensionPixelSize(R.dimen.listPopWidth)-findViewById(R.id.textView).getWidth())/2; if (leftMargin screenWidth) { listPopupWindow.setHorizontalOffset(leftMargin + getResources().getDimensionPixelSize(R.dimen.listPopWidth) - screenWidth); }
五、listpopupwindow顶部添加三角形
如果listpopupwindow要求顶部加入一个三角形,可以利用listpopfront实现。先创建一个普通的listpopupwindow,然后在其前面添加一个三角形的drawable即可。
下面是一个示例代码:
int width = getResources().getDimensionPixelSize(R.dimen.listPopWidth); int height = getResources().getDimensionPixelSize(R.dimen.listPopHeight); ListPopupWindow listPopupWindow = new ListPopupWindow(MainActivity.this); listPopupWindow.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, new String[]{"选项一", "选项二", "选项三"})); listPopupWindow.setAnchorView(findViewById(R.id.textView)); listPopupWindow.setWidth(width); listPopupWindow.setHeight(height); listPopupWindow.setDropDownGravity(Gravity.START); listPopupWindow.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorWhite))); //添加三角形 Bitmap bitmap = Bitmap.createBitmap(width, height + getResources().getDimensionPixelSize(R.dimen.listPopTriangleHeight), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE); Path path = new Path(); path.moveTo(getResources().getDimensionPixelSize(R.dimen.listPopTriangleLeft), height + getResources().getDimensionPixelSize(R.dimen.listPopTriangleHeight)); path.lineTo(getResources().getDimensionPixelSize(R.dimen.listPopTriangleLeft) + getResources().getDimensionPixelSize(R.dimen.listPopTriangleWidth)/2, height); path.lineTo(getResources().getDimensionPixelSize(R.dimen.listPopTriangleLeft) + getResources().getDimensionPixelSize(R.dimen.listPopTriangleWidth), height + getResources().getDimensionPixelSize(R.dimen.listPopTriangleHeight)); canvas.drawPath(path, paint); NinePatchDrawable ninePatchDrawable = new NinePatchDrawable(getResources(), bitmap, bitmap.getNinePatchChunk(), new Rect(), null); LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{ninePatchDrawable, listPopupWindow.getBackground()}); layerDrawable.setLayerInset(0, 0, 0, 0, 0); layerDrawable.setLayerInset(1, getResources().getDimensionPixelSize(R.dimen.listPopTriangleWidth)/2, getResources().getDimensionPixelSize(R.dimen.listPopTriangleHeight), getResources().getDimensionPixelSize(R.dimen.listPopTriangleWidth)/2, 0); listPopupWindow.setBackgroundDrawable(layerDrawable); listPopupWindow.show();
六、listpopupwindow替代方案
如果在Android程序中不想使用listpopupwindow,还有其他的替代方案。我们可以自定义一个弹出框控件,将其放置在当前页面的顶部覆盖原先的控件,并为其添加需要显示的选项。下面是一个示例代码,使用了PopupWindow来实现弹出框:
Button btn = (Button) findViewById(R.id.button); View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.listpop, null); PopupWindow popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true); popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.back)); contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int popupWidth = contentView.getMeasuredWidth(); int popupHeight = contentView.getMeasuredHeight(); int[] location = new int[2]; btn.getLocationOnScreen(location); popupWindow.showAtLocation(btn, Gravity.NO_GRAVITY, location[0] - popupWidth / 2 + btn.getWidth() / 2, location[1] - popupHeight);
在这个示例代码中,我们首先在listpop布局文件中定义了一个LinearLayout,用于显示选项,然后将其设置为PopupWindow的contentView,在布局文件中可以定义需要的样式。在代码中,我们通过PopupWindow的各个属性来设置弹出框的样式和位置,并将它在指定的位置弹出。
七、listpopupwindow去掉边框
在一些特殊的情况下,我们可能需要将listpopupwindow的边框去掉,以便更好地与界面融合。在listpopupwindow中,我们可以通过setElevation来设置弹出框的阴影,而去掉边框可以通过setBackgroundDrawable方法来实现。以下代码演示了如何去掉listpopupwindow的边框:
int width = getResources().getDimensionPixelSize(R.dimen.listPopWidth); int height = getResources().getDimensionPixelSize(R.dimen.listPopHeight); ListPopupWindow listPopupWindow = new ListPopupWindow(MainActivity.this); listPopupWindow.setAdapter(new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, new String[]{"选项一", "选项二", "选项三"})); listPopupWindow.setAnchorView(findViewById(R.id.textView)); listPopupWindow.setWidth(width); listPopupWindow.setHeight(height); listPopupWindow.setDropDownGravity(Gravity.START); listPopupWindow.setElevation(getResources().getDimension(R.dimen.listPopElevation)); listPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); listPopupWindow.show();
通过将ColorDrawable的颜色设置为透明,就可以去掉listpopupwindow的边框了。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/195547.html