package com.fuda.ui;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.TextView; import java.util.LinkedList; import com.fuda.R; public class MessageBar { public interface OnMessageClickListener { void onMessageClick(Parcelable token);
} private static final String STATE_MESSAGES = "net.simonvt.messagebar.MessageBar.messages";
private static final String STATE_CURRENT_MESSAGE = "net.simonvt.messagebar.MessageBar.currentMessage"; private static final int ANIMATION_DURATION = 600; private static final int HIDE_DELAY = 5000; private View mContainer; private TextView mTextView; private TextView mButton; private LinkedList<Message> mMessages = new LinkedList<Message>(); private Message mCurrentMessage; private boolean mShowing; private OnMessageClickListener mClickListener; private Handler mHandler; private AlphaAnimation mFadeInAnimation; private AlphaAnimation mFadeOutAnimation; public MessageBar(Activity activity) {
ViewGroup container = (ViewGroup) activity.findViewById(android.R.id.content);
View v = activity.getLayoutInflater().inflate(R.layout.mb__messagebar, container);
init(v);
} public MessageBar(View v) {
init(v);
} private void init(View v) {
mContainer = v.findViewById(R.id.mbContainer);
mContainer.setVisibility(View.GONE);
mTextView = (TextView) v.findViewById(R.id.mbMessage);
mButton = (TextView) v.findViewById(R.id.mbButton);
mButton.setOnClickListener(mButtonListener); mFadeInAnimation = new AlphaAnimation(0.0f, 1.0f);
mFadeOutAnimation = new AlphaAnimation(1.0f, 0.0f);
mFadeOutAnimation.setDuration(ANIMATION_DURATION);
mFadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
} @Override
public void onAnimationEnd(Animation animation) {
Message nextMessage = mMessages.poll(); if (nextMessage != null) {
show(nextMessage);
} else {
mCurrentMessage = null;
mContainer.setVisibility(View.GONE);
mShowing = false;
}
} @Override
public void onAnimationRepeat(Animation animation) {
}
}); mHandler = new Handler();
} public void show(String message) {
show(message, null);
} public void show(String message, String actionMessage) {
show(message, actionMessage, 0);
} public void show(String message, String actionMessage, int actionIcon) {
show(message, actionMessage, actionIcon, null);
} public void show(String message, String actionMessage, int actionIcon, Parcelable token) {
Message m = new Message(message, actionMessage, actionIcon, token);
if (mShowing) {
mMessages.add(m);
} else {
show(m);
}
} private void show(Message message) {
show(message, false);
} private void show(Message message, boolean immediately) {
mShowing = true;
mContainer.setVisibility(View.VISIBLE);
mCurrentMessage = message;
mTextView.setText(message.mMessage);
if (message.mActionMessage != null) {
mTextView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
mButton.setVisibility(View.VISIBLE);
mButton.setText(message.mActionMessage); mButton.setCompoundDrawablesWithIntrinsicBounds(message.mActionIcon, 0, 0, 0);
} else {
mTextView.setGravity(Gravity.CENTER);
mButton.setVisibility(View.GONE);
} if (immediately) {
mFadeInAnimation.setDuration(0);
} else {
mFadeInAnimation.setDuration(ANIMATION_DURATION);
}
mContainer.startAnimation(mFadeInAnimation);
mHandler.postDelayed(mHideRunnable, HIDE_DELAY);
} private final View.OnClickListener mButtonListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mClickListener != null && mCurrentMessage != null) {
mClickListener.onMessageClick(mCurrentMessage.mToken);
mCurrentMessage = null;
mHandler.removeCallbacks(mHideRunnable);
mHideRunnable.run();
}
}
}; public void setOnClickListener(OnMessageClickListener listener) {
mClickListener = listener;
} public void clear() {
mMessages.clear();
mHideRunnable.run();
} private final Runnable mHideRunnable = new Runnable() {
@Override
public void run() {
mContainer.startAnimation(mFadeOutAnimation);
}
}; public void onRestoreInstanceState(Bundle state) {
Message currentMessage = state.getParcelable(STATE_CURRENT_MESSAGE);
if (currentMessage != null) {
show(currentMessage, true);
Parcelable[] messages = state.getParcelableArray(STATE_MESSAGES);
for (Parcelable p : messages) {
mMessages.add((Message) p);
}
}
} public Bundle onSaveInstanceState() {
Bundle b = new Bundle(); b.putParcelable(STATE_CURRENT_MESSAGE, mCurrentMessage); final int count = mMessages.size();
final Message[] messages = new Message[count];
int i = 0;
for (Message message : mMessages) {
messages[i++] = message;
} b.putParcelableArray(STATE_MESSAGES, messages); return b;
} /**
*
* @author Administrator
* http://www.2cto.com/kf/201205/132814.html
*/
private static class Message implements Parcelable { final String mMessage; final String mActionMessage; final int mActionIcon; final Parcelable mToken; public Message(String message, String actionMessage, int actionIcon, Parcelable token) {
mMessage = message;
mActionMessage = actionMessage;
mActionIcon = actionIcon;
mToken = token;
} public Message(Parcel p) {
mMessage = p.readString();
mActionMessage = p.readString();
mActionIcon = p.readInt();
mToken = p.readParcelable(null);
} public void writeToParcel(Parcel out, int flags) {
out.writeString(mMessage);
out.writeString(mActionMessage);
out.writeInt(mActionIcon);
out.writeParcelable(mToken, 0);
} public int describeContents() {
return 0;
} public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() {
public Message createFromParcel(Parcel in) {
return new Message(in);
} public Message[] newArray(int size) {
return new Message[size];
}
};
}
}
//调用
private MessageBar mMessageBar;
public void showMessage(String message) {
mMessageBar.show(message, "关闭", R.drawable.ic_messagebar_undo, new Bundle());
}

android笔记--加载框的更多相关文章

  1. ios新手开发——toast提示和旋转图片加载框

    不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...

  2. Android--自定义加载框

    1,在网上看了下好看的加载框,看了一下,挺好看的,再看了下源码,就是纯paint画出来的,再加上属性动画就搞定了 再来看一下我们的源码 LvGhost.java package com.qianmo. ...

  3. 使用Dialog实现全局Loading加载框

    Dialog实现全局Loading加载框 很多人在实现Loading加载框的时候,都是在当前的页面隐藏一个Loading布局,需要加载的时候,显示出来,加载完再隐藏 使用Dialog实现Loading ...

  4. mui---取消掉默认加载框

    我们在进行打开页面新页面的时候,在APP中会在中间有一个加载框,考虑到用户体验,要取消掉,具体方法是,对openWindow进行配置: 具体参考:http://dev.dcloud.net.cn/mu ...

  5. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...

  6. 加载框(loading)

    一般在用户提交数据或者新加载页面时,请求服务器的过程,页面没有响应,但是用户并不知道,此时在发生什么.这时,就需要loading框给用户提示,增加用户体验. 1.引入loading.css. html ...

  7. Android ListView加载更多

    先看效果: ListView的footer布局: <?xml version="1.0" encoding="utf-8"?> <Relati ...

  8. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  9. Android图片加载库的理解

    前言     这是“基础自测”系列的第三篇文章,以Android开发需要熟悉的20个技术点为切入点,本篇重点讲讲Android中的ImageLoader这个库的一些理解,在Android上最让人头疼是 ...

随机推荐

  1. 使用MSTSC远程登录时提示证书无效的解决方法

    On your local machine Open Windows command prompt type: gpedit.msc -> Press Enter -> a new win ...

  2. 播布客视频PIT专用播放器MBOO2015

    播布客视频,还是挺不错... 很多视频都是pit后缀的,需要用MBOO2015才可以打开... 00.MB2015软件 01.视频样例 02.download 链接: https://pan.baid ...

  3. PL/SQL报无效的窗口句柄的解决办法

    在远程服务器上使用pl sql developer查询oralce数据库的时候,遇到很长的文本变量想点开小窗口看下具体内容, 但系统弹窗提示“无效的窗口句柄”,听同事介绍原来需要开启一个windows ...

  4. 自定义UITabbarcontrollerview

    // 初始化contentView [self initContentView]; #pragma mark 初始化contentView - (void)initContentView { CGSi ...

  5. 关于jsp发起请求加载datagrid数据(草稿)

    $(document).ready(function (){ var refNo = '${refNo}'; $('#caAbnDetail').datagrid('load',{ refNo:ref ...

  6. hibernate联合主键注解方式

    方法一:主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo类: @Embeddable public class composeIdPK impl ...

  7. Lua队列问题

    今天看到Lua程序设计第11章了,表示按照书中的例子打出来,但是不知道正确写用: List = {} function List.new () return {first = 0, last = -1 ...

  8. atime,mtime,ctime 的理解

    Linux之atime,mtime,ctime from:http://blog.sina.com.cn/s/blog_5980699f0100zkgz.html 首先可以使用stat 命令来查询文件 ...

  9. 百度地图 ijintui以及七牛、百度编辑器、kindeditor

    密码是明文存储的 sig错误是因为params没拼接上md5后的秘钥,测试时候可以在 Api\Controller\CommonController\_initialize 方法里注释掉效验的代码 代 ...

  10. webpack window 处理图片和其他静态文件

    安装url-loader npm install url-loader --save-dev 配置config文件 {        test: /\.(png|jpg)$/,        load ...