1,自定义
package com.vily.fanchatdemo.widgt;
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;
import com.hyphenate.util.DensityUtil;
import com.vily.fanchatdemo.R;
/**
* 创建者: Leon
* 创建时间: 2016/10/18 18:02
* 描述: TODO
*/
public class SlideBar extends View {
public static final String TAG = "SlideBar";
private float mTextSize = 0;
private static final String[] SECTIONS = {"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 Paint mPaint;
private int mCurrentIndex = - 1;
private float mTextBaseline = 0;
private OnSlideBarChangeListener mOnSlideBarChangeListener;
public SlideBar(Context context) {
this(context, null);
}
public SlideBar(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
private void initPaint() {
mPaint = new Paint();
mPaint.setColor(getResources().getColor(R.color.qq_section_text_color));
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setTextSize(DensityUtil.sp2px(getContext(), 10));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mTextSize = h * 1.0f / SECTIONS.length;//计算分配给字符的高度
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
float mTextHeight = fontMetrics.descent - fontMetrics.ascent;//获取绘制字符的实际高度
mTextBaseline = mTextSize / 2 + mTextHeight/2 - fontMetrics.descent;//计算字符居中时的baseline
}
@Override
protected void onDraw(Canvas canvas) {
float x = getWidth() * 1.0f / 2;
float baseline = mTextBaseline;
for(int i = 0; i < SECTIONS.length; i++) {
canvas.drawText(SECTIONS[i], x, baseline, mPaint);
baseline += mTextSize;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setBackgroundResource(R.drawable.bg_slide_bar);
notifySectionChange(event);
break;
case MotionEvent.ACTION_MOVE:
notifySectionChange(event);
break;
case MotionEvent.ACTION_UP:
setBackgroundColor(Color.TRANSPARENT);
if (mOnSlideBarChangeListener != null) {
mOnSlideBarChangeListener.onSlidingFinish();
}
break;
}
return true;
}
private void notifySectionChange(MotionEvent event) {
int index = getTouchIndex(event);
if (mOnSlideBarChangeListener != null && mCurrentIndex != index) {
mCurrentIndex = index;
mOnSlideBarChangeListener.onSectionChange(index, SECTIONS[index]);
}
}
private int getTouchIndex(MotionEvent event) {
int index = (int) (event.getY() / mTextSize);
if (index < 0) {
index = 0;
} else if (index > SECTIONS.length - 1) {
index = SECTIONS.length - 1;
}
return index;
}
public interface OnSlideBarChangeListener{
void onSectionChange(int index, String section);
void onSlidingFinish();
}
public void setOnSlidingBarChangeListener(OnSlideBarChangeListener l) {
mOnSlideBarChangeListener = l;
}
}
2,Java
mSlideBar.setOnSlidingBarChangeListener(this);
/**
* 下拉刷新
*/
@Override
public void onRefresh() {
mContactPresenter.refreshContactList();
}
/**
* 右侧下滑框
*
* @param index
* @param section
*/
@Override
public void onSectionChange(int index, String section) {
mSection.setVisibility(View.VISIBLE);
mSection.setText(section);
scrollToSection(section);
}
/**
* 滑动结束后 隐藏下滑框
*/
@Override
public void onSlidingFinish() {
mSection.setVisibility(View.GONE);
}
/**
* 右侧下滑框滑动的时候 出现对应的section 的联系人
*
* @param section
*/
private void scrollToSection(String section) {
int sectionPosition = getSectionPosition(section);
if (sectionPosition != POSITION_NOT_FOUND) {
mRecyclerView.smoothScrollToPosition(sectionPosition);
}
}
/**
* 首字符字母对应的在列表中的位置
*
* @param section
* @return
*/
private int getSectionPosition(String section) {
List<ContactListItem> contactListItems = mAdapter.getContactListItems();
for(int i=0;i<contactListItems.size();i++){
if(section.equals(contactListItems.get(i).getFirstLetterString())){
return i;
}
}
return POSITION_NOT_FOUND;
}