android标题栏下面弹出提示框(一) TextView实现,带动画效果

产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习。

弯路:

1.刚开始本来用PopupWindow去实现,做着之后发现如果用popupwindow实现的话,从标题栏下面弹出就比较麻烦.

2.最外层的布局本来是用LinearLayout去实现的,然后标题栏跟弹出的那个TextView外边包裹一层RelativeLayout,这样就会有一个问题,父布局RelativeLayout高度就是标题栏高度,提示框的高度最多也是标题栏高度,就算往下移动我们也看不到.

3.最外层布局改成RelativeLayout之后显示循序也是有秩序的,第一个是内容View,第二个是提示的View,第三个是标题栏的View.   android绘制View的原理就是最新画上去的一定在最上面,我们要保证标题栏始终显示,提示框可以遮住内容,内容是最后面的,所以需要第一个绘制。

实现步骤:

1.把显示提示View封装成自定义控件,继承自TextView.提供两个公共方法供外部调用.封装View的目的是代码复用,如果在其他地方也需要这种显示效果,在布局文件中引用自定义

    View即可

   1).showTips  显示提示View,调用向下移动动画,移动完成后延时一秒,再向上移动,并且改变透明度,动画结束后隐藏View。

   2).setTitleHeight  看名字就知道设置标题栏的高度,因为我们这边是从标题栏下面弹出,所以我们得计算标题栏的高度是多少,才能知道往下面移动多少合适.移动上去同理.

2.Activity中显示自定义View.调用自定义View的公共方法.

   1).在activity中注册回调接口来获取标题栏的高度,然后赋值给自定义View,

   2).当我们需要提示的时候调用自定View的公共方法就行.

效果图如下:


ViewTestActivity.java     主Activity,程序的入口.

/**
 * 
 * @author ansen
 * @create time 2015-10-20
 */
public class ViewTestActivity extends Activity implements OnGlobalLayoutListener{
	private TipTextView tvTips;//提示
	private TextView tvTitle;//标题
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);
		
		tvTips=(TipTextView) findViewById(R.id.tv_tips);
		tvTitle=(TextView) findViewById(R.id.tv_title);
		
		//tvTitle在一个视图树中的焦点状态发生改变时,注册回调接口来获取标题栏的高度
		ViewTreeObserver vto = tvTitle.getViewTreeObserver();   
		vto.addOnGlobalLayoutListener(this);
		
		findViewById(R.id.btn_show_tip).setOnClickListener(clickListener);
	}
	
	private OnClickListener clickListener=new OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.btn_show_tip://显示提示
				tvTips.showTips();
				break;
			}
		}
	};
	
	@SuppressLint("NewApi")
	@Override
	public void onGlobalLayout() {
		tvTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this);//删除监听
		tvTips.setTitleHeight(tvTitle.getHeight());//把标题栏的高度赋值给自定义的TextView
	}
}

activity_test.xml  显示的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <View 
        android:layout_above="@+id/btn_show_tip"
        android:layout_below="@+id/tv_title"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="#00FFFF"/>

    <com.example.tips.view.TipTextView
        android:id="@+id/tv_tips"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#faf3a1"
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        android:textColor="#ff4e00"
        android:text="用动画实现提示"
        android:visibility="gone"/>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:text="这是一个标题栏"
        android:background="#FF00FF"
        android:textSize="18sp"/>
    
    <Button
        android:id="@+id/btn_show_tip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="弹窗提示!!!"/>

</RelativeLayout>
TipTextView.java  自定义View,继承TextView

/**
 * 自定义TextView  显示提示信息,显示时有动画效果(从上面弹出,然后改变透明度慢慢隐藏)
 * @author ansen
 * @create time 2015-10-20
 */
public class TipTextView extends TextView{
	private static final int START_TIME=400;//动画显示时间
	private static final int END_TIME=400;//动画移出时间
	private static final int SHOW_TIME=1000;//动画显示时间
	
	private int titleHeight=100;//标题栏默认的高度设置成100

	public TipTextView(Context context) {
		super(context);
	}
	
	public TipTextView(Context context, AttributeSet paramAttributeSet) {
		super(context, paramAttributeSet);
	}

	public TipTextView(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);
					}
				});
			}
		},SHOW_TIME);
	}

	/**
	 * 设置标题栏高度
	 * @param titleHeight
	 */
	public void setTitleHeight(int titleHeight) {
		this.titleHeight = titleHeight;
	}
}

这篇就用TextView实现了,如果你所有的activity都需要加上这个提示,请阅读我的的下篇博客.android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

以上有步骤说明,效果图,源码,相信大家都能看懂....推荐下自己创建的android QQ群:202928390   欢迎大家的加入.

点击下载源码

posted @ 2015-10-20 17:49  安辉  阅读(1661)  评论(0编辑  收藏  举报