自定义View实现索引效果
来源:互联网 发布:树莓派zerow ubuntu 编辑:程序博客网 时间:2024/05/19 18:42
效果图展示
实现代码
public class SideLetterBar extends View { private static final 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 int choose = -1; private Paint paint = new Paint(); private boolean showBg = false; private OnLetterChangedListener onLetterChangedListener; private TextView overlay; public SideLetterBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public SideLetterBar(Context context, AttributeSet attrs) { super(context, attrs); } public SideLetterBar(Context context) { super(context); } /** * 设置悬浮的textview * @param overlay */ public void setOverlay(TextView overlay){ this.overlay = overlay; } @SuppressWarnings("deprecation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBg) { //选中时画布的背景 canvas.drawColor(getResources().getColor(R.color.shadow)); } //画出索引字母 int height = getHeight(); //获得控件高度 int width = getWidth(); //获得控件宽度 int singleHeight = height / b.length; //得到每一个字母的高度 //循环画出所有的文字和字母 for (int i = 0; i < b.length; i++) { paint.setTextSize(getResources().getDimension(R.dimen.side_letter_bar_letter_size)); paint.setColor(getResources().getColor(R.color.gray)); paint.setAntiAlias(true);//设置画笔抗锯齿 //手指摁下时当前字母颜色变为红色 if (i == choose) { paint.setColor(Color.RED); paint.setFakeBoldText(true); //加粗 } //计算相应字母的距离居中 float xPos = width / 2 - paint.measureText(b[i]) / 2; //控件宽度的一半,减去当前字符宽度的一半,得到X轴坐标 float yPos = singleHeight * i + singleHeight; //前面所有字符的高度,加上当前字符的高度,得到y轴坐标(文字绘制是从文字基线开始绘制) 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 oldChoose = choose; final OnLetterChangedListener listener = onLetterChangedListener; //相应高度的比例乘以字符数组长度就是我们要的字母 final int c = (int) (y / getHeight() * b.length); switch (action) { case MotionEvent.ACTION_DOWN: //按下 showBg = true; if (oldChoose != c && listener != null) { if (c >= 0 && c < b.length) { listener.onLetterChanged(b[c]); choose = c; invalidate(); //刷新View if (overlay != null){ overlay.setVisibility(VISIBLE); overlay.setText(b[c]); } } } break; case MotionEvent.ACTION_MOVE: //触摸 if (oldChoose != c && listener != null) { if (c >= 0 && c < b.length) { listener.onLetterChanged(b[c]); choose = c; invalidate(); if (overlay != null){ overlay.setVisibility(VISIBLE); overlay.setText(b[c]); } } } break; case MotionEvent.ACTION_UP: //抬起 showBg = false; choose = -1; invalidate(); if (overlay != null){ overlay.setVisibility(GONE); } break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnLetterChangedListener(OnLetterChangedListener onLetterChangedListener) { this.onLetterChangedListener = onLetterChangedListener; } /** * 定义回调接口用来传值 */ public interface OnLetterChangedListener { void onLetterChanged(String letter); }}
阅读全文
0 0
- 自定义View实现索引效果
- 自定义View:快速索引实现
- 自定义View实现侧边索引
- 自定义View,实现侧边索引
- 自定义View实现刮刮卡效果
- 自定义View实现SwichButton效果
- 自定义 View 实现钟表效果
- 自定义view实现炸弹效果
- 安卓之自定义view实现索引
- Android 自定义View-实现快速索引
- Android自定义View实现字母索引条
- 自定义View 实现字母快速索引控件
- android自定义View之3D索引效果
- 自定义View实现转盘旋转效果
- 自定义view实现图文环绕的效果
- 自定义view实现水波荡漾的效果
- android自定义view实现progressbar的效果
- 自定义view实现水波纹效果
- 深入Web请求过程
- java编程思想---第四章(控制执行流程)
- c++:分析智能指针shared_ptr存在的循环引用的缺陷
- 梁胜博士:写给程序员的话
- Dubbo和Spring Cloud微服务架构对比
- 自定义View实现索引效果
- 不定时更新-android学习之路
- 14个你可能不知道的javascript调试技巧
- M6G2C 飞思卡尔 嵌入式linux 内核驱动编译注意点
- 循环嵌套的应用
- 【Scikit-Learn 中文文档】概率校准
- AutoMapper官方文档(一)【入门】
- Heatmap.js 学习笔记
- navicat premium 中文破解版 11.18 mac版