android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

简介:

需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求。之前在通知栏显示的提示需要在标题栏上面弹出提示框,然后用动画去显示隐藏,并且在大部分Activity上都要显示。

问题1:用上次那个TextView隐藏在布局文件中肯定不行了,不然每个activity都要修改,于是决定用PopupWindow,只要显示在activity的根布局上就行.
问题2:需要把显示PopupWindow的方法抽出来作为一个公共方法,我这边是放到一个工具类里面,传入当前activity.
问题3:从顶部移动多少距离呢?因为我们这个提示框跟标题栏的高度不一样的,于是我就计算提示框图片的高度,作为移动的高度.

效果图如下:



PopupWindowTest.java  程序的入口,调用显示popupwindow的工具类

  1. /** 
  2.  * 显示PopupWindow的activity 
  3.  * @author ansen 
  4.  * @create time 2015-10-27 
  5.  */  
  6. public class PopupWindowTest extends Activity{  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_popupwindow_test);  
  11.           
  12.         findViewById(R.id.btn_show_tip).setOnClickListener(onClickListener);  
  13.     }  
  14.       
  15.     private OnClickListener onClickListener=new OnClickListener() {  
  16.         @Override  
  17.         public void onClick(View v) {  
  18.             switch (v.getId()) {  
  19.             case R.id.btn_show_tip://显示提示.  
  20.                 Util util=new Util();  
  21.                 util.showTips(PopupWindowTest.this);  
  22.                 break;  
  23.             }  
  24.         }  
  25.     };  
  26. }  

Util.java   封装了显示popupwindow的方法,并且增加了动画结束回调接口,动画结束隐藏popupwindow。

  1. /** 
  2.  * 封装了显示Popupwindow的方法. 
  3.  * @author ansen 
  4.  * @create time 2015-10-27 
  5.  */  
  6. public class Util implements AnimationEndCallback{  
  7.     private PopupWindow reportVideoPopwindow;  
  8.       
  9.     public void showTips(Activity activity){  
  10.         int translateHeight=(int) dip2px(activity,52);  
  11.         View parent = ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);  
  12.         View popView = LayoutInflater.from(activity).inflate(R.layout.activity_popupwindow_tips, null);  
  13.         int statusBar=getStatusBarHeight(activity);  
  14.         reportVideoPopwindow = new PopupWindow(popView,LayoutParams.MATCH_PARENT,translateHeight*2);  
  15.         reportVideoPopwindow.showAtLocation(parent,Gravity.TOP, 00);  
  16.         TipRelativeLayout tvTips=(TipRelativeLayout) popView.findViewById(R.id.rl_tips);  
  17.         tvTips.setTitleHeight(statusBar);//移动状态栏的高度  
  18.         tvTips.setAnimationEnd(this);//设置动画结束监听函数  
  19.         tvTips.showTips();//显示提示RelativeLayout,移动动画.  
  20.     }  
  21.       
  22.     public int getStatusBarHeight(Context context) {  
  23.           int result = 0;  
  24.           int resourceId = context.getResources().getIdentifier("status_bar_height""dimen""android");  
  25.           if (resourceId > 0) {  
  26.               result = context.getResources().getDimensionPixelSize(resourceId);  
  27.           }  
  28.           return result;  
  29.     }  
  30.       
  31.     private  float dip2px(Context context, float dpValue) {  
  32.         final float scale = context.getResources().getDisplayMetrics().density;  
  33.         float result = dpValue * scale + 0.5f;  
  34.         return result;  
  35.     }  
  36.       
  37.     @Override  
  38.     public void onAnimationEnd() {  
  39.         reportVideoPopwindow.dismiss();//动画结束,隐藏popupwindow  
  40.     }  
  41. }  


TipRelativeLayout.java   这个类也没啥好说的,就在原来的TipTextView基础上增加了一个动画结束回调接口。
  1. /** 
  2.  * 自定义RelativeLayout  显示提示信息,显示时有动画效果(从上面弹出,然后改变透明度慢慢隐藏) 
  3.  * @author ansen 
  4.  * @create time 2015-10-20 
  5.  */  
  6. public class TipRelativeLayout extends RelativeLayout{  
  7.     private static final int START_TIME=400;//动画显示时间  
  8.     private static final int END_TIME=400;//动画移出时间  
  9.     private static final int SHOW_TIME=1000;//动画显示时间  
  10.       
  11.     private AnimationEndCallback animationEnd;  
  12.     private int titleHeight=100;//标题栏默认的高度设置成100  
  13.   
  14.     public TipRelativeLayout(Context context) {  
  15.         super(context);  
  16.     }  
  17.       
  18.     public TipRelativeLayout(Context context, AttributeSet paramAttributeSet) {  
  19.         super(context, paramAttributeSet);  
  20.     }  
  21.   
  22.     public TipRelativeLayout(Context context, AttributeSet paramAttributeSet,int paramInt) {  
  23.         super(context, paramAttributeSet, paramInt);  
  24.     }  
  25.       
  26.     public void showTips(){  
  27.         setVisibility(View.VISIBLE);  
  28.           
  29.         //向下移动动画  
  30.         TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,0,titleHeight);  
  31.         downTranslateAnimation.setDuration(START_TIME);  
  32.         downTranslateAnimation.setFillAfter(true);  
  33.           
  34.         startAnimation(downTranslateAnimation);  
  35.           
  36.         //动画监听  
  37.         downTranslateAnimation.setAnimationListener(new AnimationListener() {  
  38.             @Override  
  39.             public void onAnimationStart(Animation animation) {}  
  40.             @Override  
  41.             public void onAnimationEnd(Animation animation){//向下移动动画结束  
  42.                 topTranslateAnimation();  
  43.             }  
  44.             @Override  
  45.             public void onAnimationRepeat(Animation animation) {}  
  46.         });  
  47.     }  
  48.       
  49.     private void topTranslateAnimation(){  
  50.         new Handler().postDelayed(new Runnable() {//延时1秒之后再向上移动  
  51.             @Override  
  52.             public void run(){  
  53.                   
  54.                 //向上移动动画  
  55.                 TranslateAnimation topTranslateAnimation=new TranslateAnimation(0,0,titleHeight,0);  
  56.                 topTranslateAnimation.setDuration(END_TIME);  
  57.                 topTranslateAnimation.setFillAfter(true);  
  58.                   
  59.                 //改变透明度  
  60.                 AlphaAnimation alphaAnimation=new AlphaAnimation(1,0);  
  61.                 alphaAnimation.setDuration(END_TIME);  
  62.                   
  63.                 //两个动画添加到动画集合中  
  64.                 AnimationSet animationSet=new AnimationSet(true);  
  65.                 animationSet.addAnimation(topTranslateAnimation);  
  66.                 animationSet.addAnimation(alphaAnimation);  
  67.                   
  68.                 startAnimation(animationSet);//开启动画  
  69.                   
  70.                 animationSet.setAnimationListener(new AnimationListener() {  
  71.                     @Override  
  72.                     public void onAnimationStart(Animation animation) {}  
  73.                     @Override  
  74.                     public void onAnimationRepeat(Animation animation) {}  
  75.                     @Override  
  76.                     public void onAnimationEnd(Animation animation){//动画结束隐藏提示的TextView  
  77.                         setVisibility(View.GONE);  
  78.                         if(animationEnd!=null){  
  79.                             animationEnd.onAnimationEnd();  
  80.                         }  
  81.                     }  
  82.                 });  
  83.             }  
  84.         },SHOW_TIME);  
  85.     }  
  86.   
  87.     /** 
  88.      * 设置标题栏高度 
  89.      * @param titleHeight 
  90.      */  
  91.     public void setTitleHeight(int titleHeight) {  
  92.         this.titleHeight = titleHeight;  
  93.     }  
  94.       
  95.     public void setAnimationEnd(AnimationEndCallback animationEnd) {  
  96.         this.animationEnd = animationEnd;  
  97.     }  
  98.       
  99.     /** 
  100.      * 动画结束监听函数 
  101.      * @author apple 
  102.      */  
  103.     public interface AnimationEndCallback{  
  104.         public void onAnimationEnd();  
  105.     }  
  106. }  

其他的布局文件什么的我就不贴出来了,有需要的自己可以去下载源码.推荐下自己创建的android QQ群:202928390   欢迎大家的加入.

点击下载源码

下载第二版   修正了某些手机状态栏的高度不对出现的bug.

目录
相关文章
|
4月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
215 30
|
4月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
436 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
4月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
146 3
|
4月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
273 65
|
4月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation 'com.github.Yufseven:JMWorkProgress:v1.0'`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
130 26
|
4月前
|
XML Android开发 数据格式
Android中SlidingDrawer利用透明动画提示效果
本文介绍了在Android中使用`SlidingDrawer`实现带有透明动画提示效果的方法。通过XML布局配置`SlidingDrawer`的把手(handle)和内容(content),结合Activity中的代码实现动态动画效果。最终实现了交互性强、视觉效果良好的滑动抽屉功能。
Android中SlidingDrawer利用透明动画提示效果
|
4月前
|
XML Java Android开发
Android 动画之帧动画 + 补间动画 + 属性动画
本文介绍了Android开发中的三种动画类型:帧动画、补间动画和属性动画。帧动画通过依次播放一系列静态图片实现动态效果,支持Java代码与XML两种实现方式。补间动画基于起始和结束位置自动生成过渡效果,涵盖透明度、位移、旋转、缩放及组合动画等多种形式,并可搭配插值器优化动画过程。属性动画则通过改变对象属性实现动画,支持透明度、位移、旋转、缩放及组合动画,灵活性更高且适用于更复杂的场景。文中提供了详细的代码示例,帮助开发者快速上手。
280 15
|
4月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
4月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
100 0
|
4月前
|
XML Java API
Android翻转动画(卡片翻转效果)
本文介绍了如何实现卡片翻转动画效果,通过Android中的ObjectAnimator结合不同插值器(LinearInterpolator、AccelerateInterpolator、DecelerateInterpolator)完成平滑过渡。示例中以按钮点击触发动画,核心逻辑包括判断视图可见性、设置旋转角度及处理初始Bug(如第一次点击异常)。最终提供完整代码(Java与XML布局),并指出将按钮事件替换为屏幕监听即可满足右滑触发需求。适合初学者学习动画实现原理。
189 0

热门文章

最新文章