Android顶部弹出提示的两种实现方式

先给大家上一张效果图:



越来越多的APP提示越来越花哨,有中间的,有顶部的,有底部的,滑动滑出的,淡入淡出的,今天就先给大家做一个简单的顶部弹出提示效果

其实这是一个很简单的功能,做起来也并不复杂,我们先看使用Toast如何实现


第一种:Toast实现

布局文件layout_toast:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="55dp"
    android:background="#ff4959"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/txtToastMessage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="测试测试"
            android:textColor="#ffffff"
            android:textSize="18sp" />
    </LinearLayout>

</LinearLayout>

就一个简单的文本嵌套,就不多说了

然后我们再看Java代码实现

if (mToast == null) {
    mToast = new Toast(mContext);
}
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.TOP, 0, 0);
View toastView = LayoutInflater.from(mContext).inflate(R.layout.layout_toast, null);
mToast.setView(toastView);
mToast.show();

运行程序我们发现并没有我们想要的效果,而是在顶部自适应显示


我们已经setView了但是并没有根据我们的布局显示我们想要的效果,原因是什么呢?通过看源码我们发现Toas并没有设置宽高的方法,而且其宽高是根据内容的大小而自适应的,所以只能自己写了。

既然没有设置宽高的方法, 那我们是否可以通过setView(View)方法动态定义View的宽高来实现呢,想到就要做,于是我这样写

WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
View toastView = LayoutInflater.from(mContext).inflate(R.layout.layout_toast, null);
if (mToast == null) {
    mToast = new Toast(mContext);
}
LinearLayout relativeLayout = (LinearLayout) toastView.findViewById(R.id.test);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(wm
        .getDefaultDisplay().getWidth(), dip2px(mContext, 60));
relativeLayout.setLayoutParams(layoutParams);
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.TOP, 0, 0);
mToast.setView(toastView);
mToast.show();

果然动态设置宽高后效果就实现了,但是这样有一个问题需要大家注意下

不能设置布局文件的根节点的宽高度,这一样无效,因此需要设置LinearLayout的宽高度

不能设置布局文件的根节点的宽高度,这一样无效,因此需要设置LinearLayout的宽高度

不能设置布局文件的根节点的宽高度,这一样无效,因此需要设置LinearLayout的宽高度

所以我在Textview上面包了一层


第二种:Popwindow实现

相对于Toast来说Popwindow实现起来就方便多了,我们只要有布局文件,只需要设置一下就可以实现跟上个相同的效果,关键代码如下:

// 把View添加到PopWindow中
this.setContentView(mPopWindow);
//设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
//设置SelectPicPopupWindow弹出窗体的高
this.setHeight(dip2px(mContext, 60));
//  设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(false);
//   设置背景透明
this.setBackgroundDrawable(new ColorDrawable(0x00000000));

点击测试:

         popUtil = new PopUtil(MainActivity.this, "我是POP测试");
               new CountDownTimer(2000, 1000) {
                   @Override
                   public void onTick(long millisUntilFinished) {
                       popUtil.showAtLocation(MainActivity.this.findViewById(R.id.pop),
Gravity.TOP, 0, 0);
                   }

                   @Override
                   public void onFinish() {
                       popUtil.dismiss();
                   }
               }.start();

我这里做了一个两秒的倒计时,两秒后自动取消PopWindow,跟Toast功能相同


结语:

其实延伸开还有很多效果可以实现,例如淡入淡出的动画效果,这就需要大家去开动脑筋去实现了

Demo地址

CSDN地址













阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页