Android實現(xiàn)仿通訊錄側(cè)邊欄滑動SiderBar效果代碼
本文實例講述了Android實現(xiàn)仿通訊錄側(cè)邊欄滑動SiderBar效果代碼。分享給大家供大家參考,具體如下:
之前看到某些應(yīng)用的側(cè)邊欄做得不錯,想想自己也弄一個出來,現(xiàn)在分享出來,當(dāng)然里面還有不足的地方,請大家多多包涵。
先上圖:

具體實現(xiàn)的代碼如下:
package com.freesonfish.listview_index;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MySideBar extends View {
private OnTouchingLetterChangedListener touchListener;
// 26個字母
public static String[] b = { "#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" };
private boolean showBkg = false;
int choose = -1;
int scrollChoose = -1;
Paint paint = new Paint();
Paint rectPaint = new Paint();
float rectWidth = 0f;
public MySideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MySideBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MySideBar(Context context) {
super(context);
init();
}
private void init() {
rectPaint.setColor(Color.parseColor("#CCCCCC"));
rectWidth = paint.measureText("#");
}
/**
* 重寫這個方法
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (showBkg) {
canvas.drawColor(Color.parseColor("#CCCCCC"));
}
final int height = getHeight();
final int width = getWidth();
final int singleHeight = height / b.length;
final float xRectPos = ((float) width - paint.measureText("#")) / 2.0f - rectWidth;
final float xRectPos2 = xRectPos + 3.0f * rectWidth;
for (int i = 0; i < b.length; i++) {
paint.setFakeBoldText(true);
paint.setAntiAlias(true);
final float xPos = ((float) width - paint.measureText(b[i])) / 2.0f;
final float yPos = singleHeight * i + singleHeight;
if (i == choose) {
paint.setColor(Color.RED);
canvas.drawRect(xRectPos, yPos - singleHeight / 2.0f, xRectPos2, yPos + rectWidth, rectPaint);
}
canvas.drawText(b[i], xPos, yPos, paint);
paint.reset();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float y = event.getY();
final int c = (int) (y / getHeight() * b.length);
switch (action) {
case MotionEvent.ACTION_DOWN:
showBkg = true;
if (choose != c && touchListener != null) {
doOnActionDown(c);
}
break;
case MotionEvent.ACTION_MOVE:
if (choose != c && touchListener != null) {
doOnActionDown(c);
}
break;
case MotionEvent.ACTION_UP:
showBkg = false;
invalidate();
break;
}
return true;
}
/**
* listview滾動時候調(diào)用它
*
* @param c
*/
public void setColorWhenListViewScrolling(int c) {
if (scrollChoose != c) {
scrollChoose = c;
String string = ListContantsUtil.AbcList.get(c);
for (int i = c; i < b.length; ++i) {
if (string.equals(b[i])) {
choose = i;
invalidate();
break;
}
}
}
}
/**
* 當(dāng)側(cè)邊欄被按下的動作
* @param c
*/
private void doOnActionDown(int c) {
if (c > 0 && c < b.length) {
if (ListContantsUtil.indexPositionMap.containsKey(b[c])) {
touchListener.onTouchingLetterChanged(b[c]);
choose = c;
invalidate();
} else {
c = c - 1;
doOnActionDown(c);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener touchListener) {
this.touchListener = touchListener;
}
/**
* 用來通知activity顯示選中的字母
* @author freeson
*
*/
public interface OnTouchingLetterChangedListener {
public void onTouchingLetterChanged(String s);
}
}
然后ListContantsUtil類是存儲通訊錄名字的拼音等的類,具體也如下:
package com.freesonfish.listview_index;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ListContantsUtil {
static final List<Integer> indexPositionList = new ArrayList<Integer>();
static final List<String> AbcList = new ArrayList<String>();
static final HashMap<String, Integer> indexPositionMap = new HashMap<String, Integer>();
static void putNameIndexToMap(List<String> list, HashMap<String, String> nameAndPinyin) {
int lenght = list.size();
for (int i = 0; i < lenght; ++i) {
String name = nameAndPinyin.get(list.get(i)).substring(0, 1);
// 判斷該字符是屬于字母還是數(shù)字或其他的
int ascii = name.toCharArray()[0];
if (ascii >= 65 && ascii <= 90) {
if (!indexPositionMap.containsKey(name)) {
indexPositionMap.put(name, i);
AbcList.add(name);
indexPositionList.add(i);
}
} else {
if (!indexPositionMap.containsKey("#")) {
indexPositionMap.put("#", i);
AbcList.add("#");
indexPositionList.add(i);
}
}
}
}
}
注意,上面的程序還是有些小問題的,請大家注意優(yōu)化解決。
完整實例代碼代碼點擊此處本站下載。
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android之PreferenceActivity應(yīng)用詳解
為了引入這個概率 首先從需求說起 即:現(xiàn)有某Activity專門用于手機屬性設(shè)置 那么應(yīng)該如何做呢2012-11-11
Android BadTokenException異常解決案例詳解
這篇文章主要介紹了Android BadTokenException異常詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-08-08
Android入門之利用Spinner實現(xiàn)彈出選擇對話框
這篇文章主要為大家詳細介紹了Android里如何巧用Spinner做彈出選擇對話框,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下2022-11-11
Android獲取網(wǎng)絡(luò)圖片并顯示的方法
這篇文章主要為大家詳細介紹了Android獲取網(wǎng)絡(luò)圖片并顯示的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11

