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