下面实现一个简单的字母导航,效果不如意的可以根据自己的需求更改,小左没有提供相应的自定义属性和接口。
效果图如下:
源码:
public class NavigationView extends View{
private Paint mPaint;//画笔
private String mText = "#ABCDEFGHIGKLMNOPQRSTUVWXYZ#";//显示的字母符号
private int mChoose = -1;//选中的字母
private float mCharSize = 30f;//字母默认大小
private boolean mShowBkg = false;//触摸显示背景
private boolean mShowTip = true;//默认显示选中的字母
//弹框
private PopupWindow mPopupWindow;
private TextView mPopupText;
private int mScreenWidth;
private Drawable mTipBgDrawable;
private OnItemClickListener mOnItemClickListener;
public NavigationView(Context context) {
this(context, null);
}
public NavigationView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public NavigationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData(context);
}
private void initData(Context context) {
mPaint = new Paint();
mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;
}
public int getSize() {
return mText == null ? 0 : mText.length();
}
public void setTip(boolean flag) {
mShowTip = flag;
}
public void setTipBackground(Drawable drawable) {
mTipBgDrawable = drawable;
}
//绘制
@Override
protected void onDraw(Canvas canvas) {
if (mShowBkg) {
canvas.drawColor(Color.parseColor("#4d000000"));
} else {
canvas.drawColor(Color.parseColor("#00000000"));
}
int height = getHeight();
int width = getWidth();
int singleHeight = height / mText.length();
for (int i = 0; i < mText.length(); i++) {
mPaint.setColor(Color.parseColor("#ff555555"));
mPaint.setTextSize(mCharSize);
mPaint.setFakeBoldText(true);
mPaint.setAntiAlias(true);
if (i == mChoose) {
mPaint.setColor(Color.parseColor("#3399ff"));
}
float xPos = width / 2 - mPaint.measureText(String.valueOf(mText.charAt(i))) / 2;
float yPos = singleHeight * i + singleHeight;
canvas.drawText(String.valueOf(mText.charAt(i)), xPos, yPos, mPaint);
mPaint.reset();
}
}
//触摸
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float y = event.getY();
final int oldChoose = mChoose;
final int c = (int) (y / getHeight() * mText.length());
switch (action) {
case MotionEvent.ACTION_DOWN:
mShowBkg = true;
if (oldChoose != c) {
if (c >= 0 && c < mText.length()) {
performItemClicked(c);
mChoose = c;
invalidate();
}
}
break;
case MotionEvent.ACTION_MOVE:
if (oldChoose != c) {
if (c >= 0 && c < mText.length()) {
performItemClicked(c);
mChoose = c;
invalidate();
}
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mShowBkg = false;
mChoose = -1;
dismissPopup();
invalidate();
break;
}
return true;
}
private void performItemClicked(int item) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(item, String.valueOf(mText.charAt(item)));
}
if (mShowTip) {
showPopup(item);
}
}
private void showPopup(int item) {
if (mPopupWindow == null) {
mPopupText = new TextView(getContext());
if (mTipBgDrawable != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mPopupText.setBackground(mTipBgDrawable);
}else {
mPopupText.setBackgroundColor(Color.WHITE);
}
mPopupText.setTextColor(Color.CYAN);
mPopupText.setTextSize(mCharSize);
mPopupText.setGravity(Gravity.CENTER);
mPopupWindow = new PopupWindow(mPopupText, mScreenWidth / 4, mScreenWidth / 4);
}
String text = String.valueOf(mText.charAt(item));
mPopupText.setText(text);
if (mPopupWindow.isShowing()) {
mPopupWindow.update();
} else {
mPopupWindow.showAtLocation(getRootView(), Gravity.CENTER, 0, 0);
}
}
private void dismissPopup() {
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
public interface OnItemClickListener {
/**
* @param index 字母下标
* @param s 选择的字母
*/
void onItemClick(int index, String s);
}
}
![吐舌头](https://static-blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)