上一篇講到自定義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();
}
很簡單,效果就出來了。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TNwAzMxUTM2EzMwYDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)