/**
* 窗口中间显示半透明提示框的小组件 用法:1. new 2. showPrevLetter(String prevLetter)
*
* @author LL
*
*/
public class PrevLetterDialog {
// 窗体消失的延时时间
private static final int DELAYED_HIDEN = 10000000;
// 实现Runnable接口的类
private RemoveWindow mRemoveWindow = new RemoveWindow();
// 在Handler里能实现对UI线程的修改
private Handler mHandler;
// 窗体管理器
private WindowManager mWindowManager;
// 显示在窗体中间半透明的字体框
private TextView mDialogText;
// 显示在窗体中间半透明的加载进度条
private ProgressBar pb;
// 是否正在显示中
private boolean mShowing = false;
// 是否准备好显示了
private boolean mReady = true;
// 显示在窗体中的字符
private char mPrevLetter = Character.MIN_VALUE;
private LayoutParams lp1;
/**
* 注明:context一定要在可见UI中通过getContext()获得,否则会抛异常。
*
* @param context
*/
public PrevLetterDialog(Context context) {
// 得到窗体管理器
mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
// 得到布部创建者
LayoutInflater inflate = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 得到TextView
// mDialogText = (TextView) inflate.inflate(R.layout.list_position,
// null);
// mDialogText.setGravity(Gravity.CENTER);
// mDialogText.setText("王");
// mDialogText.setLayoutParams(lp1);
// mDialogText.setTextSize(80);
// 得到ProgressBar
pb = (ProgressBar) inflate.inflate(R.layout.window_position, null);
pb.setBackgroundColor(Color.BLACK);
// 窗体的布局参数1
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
lp.gravity = Gravity.CENTER;
// 窗体的布局参数2
lp1 = new LayoutParams(130, 100,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
mDialogText = new TextView(context);
lp1.gravity = Gravity.CENTER;
// 通过handler把mDialogText展示出来
mHandler = new Handler();
// 要用post可实现在多线程里调用UI线程并改变
mHandler.post(new Runnable() {
public void run() {
mReady = true;
// 把TextView添加到窗体中去
// mWindowManager.addView(mDialogText, lp1);
mWindowManager.addView(pb, lp1);
}
});
}
// 设置可见性
public void setmReady(boolean mReady) {
this.mReady = mReady;
}
/**
* 一般用在onScroll方法中,参数是字符串,不能为空,会取第一个字符显示
*
* @param prevLetter
*/
public void showPrevLetter(String prevLetter) {
if (!mReady) {
return;
}
char firstLetter = prevLetter.charAt(0);
if (!mShowing && firstLetter != mPrevLetter) {
mShowing = true;
mDialogText.setVisibility(View.VISIBLE);
}
// // 设TextView显示的字体
// mDialogText.setText(((Character) firstLetter).toString());
// 移除mRemoveWindow实现的Runnable接口类
mHandler.removeCallbacks(mRemoveWindow);
// 添加mRemoveWindow实现的Runnable接口类,并设延时
mHandler.postDelayed(mRemoveWindow, DELAYED_HIDEN);
mPrevLetter = firstLetter;
}
/**
* 实现Runnable接口的类
*/
private final class RemoveWindow implements Runnable {
public void run() {
removeWindow();
}
}
private void removeWindow() {
if (mShowing) {
mShowing = false;
mDialogText.setVisibility(View.INVISIBLE);
}
}
}
调用
pd = new PrevLetterDialog(DisplayDocActivity.this, R.anim.loadfileanim,
150, 150);
pd.showPrevLetter("这");