android笔记--加载框
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笔记--加载框的更多相关文章
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- Android--自定义加载框
1,在网上看了下好看的加载框,看了一下,挺好看的,再看了下源码,就是纯paint画出来的,再加上属性动画就搞定了 再来看一下我们的源码 LvGhost.java package com.qianmo. ...
- 使用Dialog实现全局Loading加载框
Dialog实现全局Loading加载框 很多人在实现Loading加载框的时候,都是在当前的页面隐藏一个Loading布局,需要加载的时候,显示出来,加载完再隐藏 使用Dialog实现Loading ...
- mui---取消掉默认加载框
我们在进行打开页面新页面的时候,在APP中会在中间有一个加载框,考虑到用户体验,要取消掉,具体方法是,对openWindow进行配置: 具体参考:http://dev.dcloud.net.cn/mu ...
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...
- 加载框(loading)
一般在用户提交数据或者新加载页面时,请求服务器的过程,页面没有响应,但是用户并不知道,此时在发生什么.这时,就需要loading框给用户提示,增加用户体验. 1.引入loading.css. html ...
- Android ListView加载更多
先看效果: ListView的footer布局: <?xml version="1.0" encoding="utf-8"?> <Relati ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
- Android图片加载库的理解
前言 这是“基础自测”系列的第三篇文章,以Android开发需要熟悉的20个技术点为切入点,本篇重点讲讲Android中的ImageLoader这个库的一些理解,在Android上最让人头疼是 ...
随机推荐
- 无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决
问题描述 最近用一台Windows Server 2012 R2系统的机器的时候碰到了这个问题. 因为在网上看了很多解决方案,都没有很好的解决.所以记录一下这个问题的解决. 之前使用VS2013编译出 ...
- Libevent例子(一)
服务器端 #include<stdio.h> #include<string.h> #include<errno.h> #include<event.h> ...
- BackgroundWorker使用方法
在做GUI界面程序的时候,经常会遇到执行长时间方法的需求,当执行长时间方法的同时,再去点击界面,界面就会出现“卡死.假死”的现象,这是因为界面GUI线程被阻塞而导致暂时无响应.解决的方法有很多种,下面 ...
- spring事务管理——编程式事务、声明式事务
本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...
- Weex学习与实践
Weex学习与实践(一):Weex,你需要知道的事 本文主要介绍包括Weex基本介绍.Weex源码结构.初始化工程.we代码结构.Weex的生命周期.Weex的工作原理.页面间通信.boxmodel ...
- 关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明
关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明 1. mod_evasive 介绍: mod_evasive 是Apache(httpd)服务器的防DDOS的一个 ...
- RHEL/CentOS 7.x/6.x/5.x开启EPEL仓库
说明 原文链接 翻译:@adolphlwq 项目地址 这篇指南文章教你如何在 RHEL/CentOS 7.x/6.x/5.x 系统中开启EPEL仓库支持,以便你可以使用 yum 命令 安装额外的标准开 ...
- MFC的DLL中实现定时器功能
方法一:创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了.DWORD WINAPI TimerThread(LPVOID pamaram) { UINT oldTic ...
- springboot(六):如何优雅的使用mybatis
这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...
- HDU 2492 Ping pong (数状数组)
Ping pong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...