天天看點

聯系人清單字母排序索引(二)

上一篇講到自定義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();
    }
           

很簡單,效果就出來了。

聯系人清單字母排序索引(二)

繼續閱讀