一、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
微信扫一扫
支付宝扫一扫