zoukankan      html  css  js  c++  java
  • android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

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

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

    效果图如下:



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

    /**
     * 显示PopupWindow的activity
     * @author ansen
     * @create time 2015-10-27
     */
    public class PopupWindowTest extends Activity{
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_popupwindow_test);
    		
    		findViewById(R.id.btn_show_tip).setOnClickListener(onClickListener);
    	}
    	
    	private OnClickListener onClickListener=new OnClickListener() {
    		@Override
    		public void onClick(View v) {
    			switch (v.getId()) {
    			case R.id.btn_show_tip://显示提示.
    				Util util=new Util();
    				util.showTips(PopupWindowTest.this);
    				break;
    			}
    		}
    	};
    }

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

    /**
     * 封装了显示Popupwindow的方法.
     * @author ansen
     * @create time 2015-10-27
     */
    public class Util implements AnimationEndCallback{
    	private PopupWindow reportVideoPopwindow;
    	
    	public void showTips(Activity activity){
    		int translateHeight=(int) dip2px(activity,52);
    		View parent = ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
    		View popView = LayoutInflater.from(activity).inflate(R.layout.activity_popupwindow_tips, null);
    		int statusBar=getStatusBarHeight(activity);
    		reportVideoPopwindow = new PopupWindow(popView,LayoutParams.MATCH_PARENT,translateHeight*2);
    		reportVideoPopwindow.showAtLocation(parent,Gravity.TOP, 0, 0);
    		TipRelativeLayout tvTips=(TipRelativeLayout) popView.findViewById(R.id.rl_tips);
    		tvTips.setTitleHeight(statusBar);//移动状态栏的高度
    		tvTips.setAnimationEnd(this);//设置动画结束监听函数
    		tvTips.showTips();//显示提示RelativeLayout,移动动画.
    	}
    	
    	public int getStatusBarHeight(Context context) {
    		  int result = 0;
    		  int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    		  if (resourceId > 0) {
    		      result = context.getResources().getDimensionPixelSize(resourceId);
    		  }
    		  return result;
    	}
    	
    	private  float dip2px(Context context, float dpValue) {
    		final float scale = context.getResources().getDisplayMetrics().density;
    		float result = dpValue * scale + 0.5f;
    		return result;
    	}
    	
    	@Override
    	public void onAnimationEnd() {
    		reportVideoPopwindow.dismiss();//动画结束,隐藏popupwindow
    	}
    }


    TipRelativeLayout.java   这个类也没啥好说的,就在原来的TipTextView基础上增加了一个动画结束回调接口。
    /**
     * 自定义RelativeLayout  显示提示信息,显示时有动画效果(从上面弹出,然后改变透明度慢慢隐藏)
     * @author ansen
     * @create time 2015-10-20
     */
    public class TipRelativeLayout extends RelativeLayout{
    	private static final int START_TIME=400;//动画显示时间
    	private static final int END_TIME=400;//动画移出时间
    	private static final int SHOW_TIME=1000;//动画显示时间
    	
    	private AnimationEndCallback animationEnd;
    	private int titleHeight=100;//标题栏默认的高度设置成100
    
    	public TipRelativeLayout(Context context) {
    		super(context);
    	}
    	
    	public TipRelativeLayout(Context context, AttributeSet paramAttributeSet) {
    		super(context, paramAttributeSet);
    	}
    
    	public TipRelativeLayout(Context context, AttributeSet paramAttributeSet,int paramInt) {
    		super(context, paramAttributeSet, paramInt);
    	}
    	
    	public void showTips(){
    		setVisibility(View.VISIBLE);
    		
    		//向下移动动画
    		TranslateAnimation downTranslateAnimation=new TranslateAnimation(0,0,0,titleHeight);
    		downTranslateAnimation.setDuration(START_TIME);
    		downTranslateAnimation.setFillAfter(true);
    		
    		startAnimation(downTranslateAnimation);
    		
    		//动画监听
    		downTranslateAnimation.setAnimationListener(new AnimationListener() {
    			@Override
    			public void onAnimationStart(Animation animation) {}
    			@Override
    			public void onAnimationEnd(Animation animation){//向下移动动画结束
    				topTranslateAnimation();
    			}
    			@Override
    			public void onAnimationRepeat(Animation animation) {}
    		});
    	}
    	
    	private void topTranslateAnimation(){
    		new Handler().postDelayed(new Runnable() {//延时1秒之后再向上移动
    			@Override
    			public void run(){
    				
    				//向上移动动画
    				TranslateAnimation topTranslateAnimation=new TranslateAnimation(0,0,titleHeight,0);
    				topTranslateAnimation.setDuration(END_TIME);
    				topTranslateAnimation.setFillAfter(true);
    				
    				//改变透明度
    				AlphaAnimation alphaAnimation=new AlphaAnimation(1,0);
    				alphaAnimation.setDuration(END_TIME);
    				
    				//两个动画添加到动画集合中
    				AnimationSet animationSet=new AnimationSet(true);
    				animationSet.addAnimation(topTranslateAnimation);
    				animationSet.addAnimation(alphaAnimation);
    				
    				startAnimation(animationSet);//开启动画
    				
    				animationSet.setAnimationListener(new AnimationListener() {
    					@Override
    					public void onAnimationStart(Animation animation) {}
    					@Override
    					public void onAnimationRepeat(Animation animation) {}
    					@Override
    					public void onAnimationEnd(Animation animation){//动画结束隐藏提示的TextView
    						setVisibility(View.GONE);
    						if(animationEnd!=null){
    							animationEnd.onAnimationEnd();
    						}
    					}
    				});
    			}
    		},SHOW_TIME);
    	}
    
    	/**
    	 * 设置标题栏高度
    	 * @param titleHeight
    	 */
    	public void setTitleHeight(int titleHeight) {
    		this.titleHeight = titleHeight;
    	}
    	
    	public void setAnimationEnd(AnimationEndCallback animationEnd) {
    		this.animationEnd = animationEnd;
    	}
    	
    	/**
    	 * 动画结束监听函数
    	 * @author apple
    	 */
    	public interface AnimationEndCallback{
    		public void onAnimationEnd();
    	}
    }

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

    点击下载源码

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

  • 相关阅读:
    CTF SQL注入知识点
    Rot13加密算法
    LFU缓存
    Redability
    快排
    更新卡片的zIndex
    webshell文件下载器
    [转]背包九讲
    hihocoder第196周
    Python import容易犯的一个错误
  • 原文地址:https://www.cnblogs.com/yishaochu/p/5078594.html
Copyright © 2011-2022 走看看