上一篇讲到自定义View,右边字母索引,如果还没看第一篇文章的,请先看联系人列表字母排序索引(一)。今天这里讲如何展示悬浮窗并显示对应的字母。
首先,我们需要一个悬浮窗,然后将悬浮窗和字母索引链接起来。
1.悬浮窗的实现。要实现一个悬浮窗口,我们需要通过WindowManger来实现,这个使用是比较简单的。
新建一个类,LetterWindow.class 这个类需要完成的功能是,显示窗口,关闭窗口,显示指定字母,可以更新字母。对应的方法为
show(),update;hide()。
package com.mjc.contactlistdemo.sort_by_letter;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.TextView;
import com.mjc.contactlistdemo.R;
/**
* Created by mjc on 2016/5/12.
* 字母索引显示窗口
*/
public class LetterWindow {
private final TextView tv;
private WindowManager.LayoutParams mParams;
private Context context;
private WindowManager wm;
public LetterWindow(Activity context) {
this.context = context;
wm = (WindowManager) context.getSystemService(
Context.WINDOW_SERVICE);
mParams = new WindowManager.LayoutParams();
mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
mParams.format = PixelFormat.TRANSLUCENT;
mParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
mParams.width = dm.widthPixels / 5;//窗口的宽和高
mParams.height = dm.widthPixels / 5;
mParams.x = 0;//窗口不偏移
mParams.y = 0;
//创建TextView
tv = new TextView(context);
tv.setTextColor(Color.WHITE);
tv.setBackgroundResource(R.drawable.bg_contact);
tv.setTextSize(30);
tv.setGravity(Gravity.CENTER);
}
public void show(String s) {
tv.setText(s);
wm.addView(tv, mParams);
}
public void update(String s) {
tv.setText(s);
wm.updateViewLayout(tv, mParams);
}
public void hide() {
wm.removeView(tv);
}
}
构造方法中,指定了窗口的类型为应用窗口的子窗口,并设置了不接收触摸事件,不偏移,指定了窗口的宽和高等参数。这样一个简单的浮动窗口就实现了。
2.点击字母索引,显示浮动窗口,滑动时更新,以及释放关闭。
<com.mjc.contactlistdemo.sort_by_letter.IndexView
android:id="@+id/civ"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right" />
首先在activity的布局文件中,放入我们自定义的字母索引控件。然后在Activity中得到这个控件,设置监听事件
mIndexView = (IndexView) findViewById(R.id.civ);
mIndexView.setOnLetterTouchedListener(this);
mLetterWindow = new LetterWindow(this);
实现字母索引的监听方法
@Override
public void onTouch(String s) {
mLetterWindow.show(s);
}
@Override
public void onLetterChanged(String preLetter, String letter) {
mLetterWindow.update(letter);
}
@Override
public void onRelease() {
mLetterWindow.hide();
}
很简单,效果就出来了。