带有圆角和透明背景的 Android 自定义警报对话框
Posted
技术标签:
【中文标题】带有圆角和透明背景的 Android 自定义警报对话框【英文标题】:Android custom alert dialog with rounded corners and transparent background 【发布时间】:2014-03-13 22:21:43 【问题描述】:我使用LinearLayout
的onDraw
创建了一个带有圆角的自定义AlertDialog,如下所示,
public class RoundedLinearLayout extends LinearLayout
private Paint drawPaint;
private Paint roundPaint;
private int mCornerRadius = 100;
private RectF bounds;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public RoundedLinearLayout(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
onInit();
public RoundedLinearLayout(Context context, AttributeSet attrs)
super(context, attrs);
onInit();
public RoundedLinearLayout(Context context)
super(context);
onInit();
protected void onInit()
drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);
setWillNotDraw(false);
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
super.onSizeChanged(w, h, oldw, oldh);
if (w != oldw && h != oldh)
bounds = new RectF(0, 0, w, h);
@Override
protected void dispatchDraw(Canvas canvas)
Bitmap bitmap = Bitmap.createBitmap((int) bounds.width(), (int) bounds.height(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
super.dispatchDraw(c);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);
canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, paint);
然后我通过 getWindow()
添加透明度并设置 window.alpha = 0.5f
。
结果对话框是,
我想删除那些角落的白色背景。我在这里搜索了 100 多个问题,但没有答案可以让我获得完美的圆角警报对话框。任何帮助将不胜感激!
【问题讨论】:
android Dialog - Rounded Corners and Transparency的可能重复 【参考方案1】:使用 dialog_corner 在可绘制文件夹中创建 xml。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/main_background"/>
<corners
android:topLeftRadius="@dimen/margin_10" android:topRightRadius="@dimen/margin_10"
android:bottomRightRadius="@dimen/margin_10" android:bottomLeftRadius="@dimen/margin_10" />
</shape>
2.放入布局
android:background="@drawable/dialog_corner"
3.在你的java文件中保留下面的代码
View mView =LayoutInflater.from(mContext).inflate(R.layout.layout_pob,null);
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
【讨论】:
【参考方案2】:这个可以解决:
dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));
【讨论】:
【参考方案3】:这是第一次为我工作
dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));
这里是从drawable文件夹获取资源,background_verification是drawable文件
【讨论】:
【参考方案4】:这对我有用
dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));
背景验证是我的drawable文件
【讨论】:
【参考方案5】:使用这个:
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
这是最简单的解决方案,而且很有效。
【讨论】:
【参考方案6】:我用这个,它对我有用:
ConfirmacionMensaje customDialog = new ConfirmacionMensaje(MainActivity.this);
customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
customDialog.show();
ConfirmacionMensaje 从对话框扩展
这是我用于对话框的 xml:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<solid android:color="#ffDB0000"/>
<corners
android:bottomLeftRadius="4dp"
android:bottomRightRadius="4dp"
android:topLeftRadius="4dp"
android:topRightRadius="4dp" />
</shape>
【讨论】:
如何弹出?我试过这个 popup.getContentView().setBackgroundResource(android.R.color.transparent);但没用【参考方案7】:如果您的对话框是 AlertDialog
或 Dialog
的实例,请将以下内容添加到您的代码中:
myDialog
.getWindow()
.setBackgroundDrawable(new ColorDrawable(Color.argb(0,0,0,0)));
旁注:扩展LinearLayout
以应用圆角框,我认为这不是一个好习惯,您也可以通过非常简单的 XML 表示来做到这一点,在这种情况下,XML 矩形可以提供更多帮助:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
...
<corners
android:radius="3dp" />
...
</shape>
【讨论】:
感谢您的宝贵时间!我已经尝试了这两种方法,但无法消除那些白色的角落。【参考方案8】:您确定要使用对话框吗? 它看起来更像是一个临时弹出窗口,比如吐司或面包块:
http://www.grokkingandroid.com/useful-android-libraries-crouton/ http://www.androidviews.net/2013/05/httpsimonvt-github-iomessagebar/ https://plus.google.com/+RomanNurik/posts/RA9WEEGWYp6 。关于背景,您可以使用 9-patch 或自定义 xml 可绘制对象(例如 here 和 here)...
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 @LeeTaylor 有很多代码要复制到这里。对不起。【参考方案9】:使用警告对话框使用简单对话框
LayoutInflater factory = LayoutInflater.from(getActivity());
AlertDialog alert = new AlertDialog.Builder(getActivity());
Dialog dialog = new Dialog(getActivity());
dialog.setContentView(your layout);
dialog.getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
【讨论】:
根据Dialogs:“Dialog 类是对话框的基类,但你应该避免直接实例化 Dialog。”这可能会解决透明角问题,但对我来说它引入了其他问题。 我尝试了十几种不同的方法,而这确实是唯一有效的方法。无论文档怎么说,您都必须使用简单的Dialog
。以上是关于带有圆角和透明背景的 Android 自定义警报对话框的主要内容,如果未能解决你的问题,请参考以下文章
Android:带有自定义标题的圆角TextView XML布局
如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?