Android中ListView右边的导航栏自定义
来源:互联网 发布:江南龙族大画集淘宝店 编辑:程序博客网 时间:2024/05/16 13:00
今天给大家带来一个我们常见的导航
是不是很常见有木有??
其实这个自定义view很简单,我带大家一起来研究研究
1.首先得有个数据源,数据源就是你要展示在右边的数据
private String[] strs = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "W", "X", "Y", "Z"};2.初始化画笔,这里定义了两个画笔,一个是普通的画笔,一个是手指触摸的画笔
paintTxt = new Paint();paintTxt.setColor(Color.parseColor("#1BB6D1"));paintTxt.setTextSize(50);paintTxt.setAntiAlias(true);paintChecked = new Paint();paintChecked.setColor(Color.parseColor("#606776"));paintChecked.setTextSize(50);paintChecked.setAntiAlias(true);
3.onMeasure测量,一个View要显示在视图上,首先要经过onMeasure方法测量得到该view的大小,然后通过Onlayout确定它本身在摆放的位置,最后
才是ondraw进行绘制。
private int measureSpec(int spec,int type){int rsize = 0;int mode = MeasureSpec.getMode(spec);int size = MeasureSpec.getSize(spec);switch (mode) {case MeasureSpec.EXACTLY:rsize = size;break;case MeasureSpec.AT_MOST:if(type == 0){ //测量宽度rsize = (int) (paintTxt.measureText(strs[0])+getPaddingLeft()+getPaddingRight()); }else{ //测量高度rsize = size;}break;case MeasureSpec.UNSPECIFIED:break;default:break;}return rsize;}
如果是Mode是EXACTLY,说明是确定大小的,就直接让系统测出来的size去赋值就行,如果Mode是AT_MOST的话,就说明view是根据自身内容大小决定的,宽度就是字体的宽度加上左右Padding得到。
3.进行绘制,如果是被选中的,就用另外一只画笔绘制
protected void onDraw(Canvas canvas) {int width = getWidth();int height = getHeight();conentHeigt = height/strs.length;for (int i = 0; i < strs.length; i++) {if(i == checked){canvas.drawText(strs[i], width/2-paintTxt.measureText(strs[i])/2,conentHeigt*(1+i),paintChecked);}else{ canvas.drawText(strs[i], width/2-paintTxt.measureText(strs[i])/2,conentHeigt*(1+i),paintTxt); }}}
4.在onTouchEvent方法中进行触摸判断
@Overridepublic boolean onTouchEvent(MotionEvent event) {int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:measureIndex(y);break;case MotionEvent.ACTION_MOVE:measureIndex(y);break;case MotionEvent.ACTION_UP:this.checked = -1;invalidate();break;}return true;}measureIndex方法是判断当前手指触摸的位置是对应整个导航的哪一个数值
private void measureIndex(int y){ int checked = y/conentHeigt; if(checked == this.checked){ return; } if(checked < 0){ checked = 0; } if(checked >= strs.length){ checked = strs.length - 1; } this.checked = checked; if(onCheckedCallBack != null){ onCheckedCallBack.onChecked(strs[this.checked]); } invalidate();}这里利用接口回调弄一个接口调用当前坐标所对应的数值暴露出去。
public interface OnCheckedCallBack{ void onChecked(String checkedStr); }
public void setOnCheckedCallBack(OnCheckedCallBack onCheckedCallBack) { this.onCheckedCallBack = onCheckedCallBack; }
这样大体就实现的一个自定义SIdeBar
0 1
- Android中ListView右边的导航栏自定义
- Android中ListView的分页--自定义ListView
- Android中自定义ListView
- Android中自定义ListView
- Android中自定义ListView
- 自定义导航栏左边按钮的位置靠左问题,右边按钮的位置靠右的问题
- Android中ListView的自定义显示
- Android中自定义ListView问题的解决方案
- 自定义导航右边多个按钮
- android自定义导航栏
- Android ListView的右边滚动滑块启用方法
- [iOS_Dev] 调整间距---导航栏右边的按钮
- 导航栏 右边定义两个按钮的处理
- 自定义Android的ListView
- Android自定义右边带删除按钮的EditText
- Android 自定义 EditText 达到从右边输入的效果
- Android中自定义ListView中各项的背景色
- Android 自定义横向ListView实现无限级菜单导航类目
- Java多态性理解
- Java进阶06 容器
- 将手机号,银行卡,身份证只显示前三位和后四位。为了保护用户的信息
- mysql存储过程
- C语言实现单链表节点的删除(带头结点)
- Android中ListView右边的导航栏自定义
- 深入理解HTTP Session
- Android粒子效果之雨
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(1)
- VBA教程初级(一):简单宏
- 串口编程 tcflush()函数
- POJ 1236 Network of Schools【强连通分量分解&&缩点||tarjan&&缩点】
- JavaScript 闭包
- 用MATLAB處理grib2數據