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. Spring Cloud Dalston.SR5 BUG一记

    使用Dalston.SR5版本的Zuul时, 发现Ribbon重试不能切换服务实例, 换成Edgware.SR3,同样的配置可以切换实例进行重试 还有个不升级所有Spring Cloud组件的方法,仅 ...

  2. git 不用clone整个远程仓库,只把特定的commit给fetch下来的方案

    一个麻烦点就是,我需要阅读一个大点的开源项目,远程仓库的代码量太庞大了,如果我需要git reset --hard [commit sha1]感兴趣的commit快照,就首先得git clone整个远 ...

  3. FTP命令字和响应码解释

    FTP命令: 命令  描述  ABOR 中断数据连接程序 ACCT <account> 系统特权帐号 ALLO <bytes>  为服务器上的文件存储器分配字节 APPE &l ...

  4. 自定义UITabbarcontrollerview

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

  5. 实现仿UC浏览器首页下拉动画

    经常用UC看到首页有这么一个动画,就仿造写了一下. 实现分析 1.画曲线的动画 这个一眼看去就想到用贝塞尔曲线画,来看贝塞尔曲线方法,给出两个定点,和一个控制点就可以画. CGContextAddQu ...

  6. 老男孩linux实训学生入学资格考试题(技术部分)

    ################################################################ 本文内容摘录于老男孩linux实战运维培训中心入学考试题(答案部分) ...

  7. k8s实战之Service

    一.概述 为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,k8s中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构,任何 ...

  8. jquery datetimepicker 配置参数

    jquery的datetimepicker时间控件除了样式有点不太美观,功能性还是相当强大的. 在正常情况下input的type应该设置为"text",可点击又可输入(mask,e ...

  9. 开源项目mark

    1. Apache的开源软件列表 http://www.oschina.net/project/apache 2. Java开源Apache项目 http://www.open-open.com/56 ...

  10. VM页面中遍历枚举类

    1)自定义的枚举类如下所示: public enum BusType { MID_SMALL(1, "中小件"), FRESH(2, "生鲜"), GLOBAL ...