产品经理用的是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 欢迎大家的加入.