使用自定义View绘制右侧导航栏

来源:互联网 发布:四九算法是虚岁 编辑:程序博客网 时间:2024/04/29 00:12

像很多的应用程序里面都有个管理联系人的导航栏,即:26个大写字母竖排显示在右侧,然后点击一个字母,listview会自动筛选分组;下面是一个自定义的view,绘制的右侧导航,即:把右侧的导航作为一个单独的View来使用,可以作为一个工具的View,随时随地的使用!

 `/** * 利用自定义View 绘制右侧导航 * @author fz * */public class MyView extends View {   public static String[] letter={"热门","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"};   Paint paint;   OnTouchLetterListener listener;   // 调用这个方法来进行回调   public void setOnTouchListener(OnTouchLetterListener listener){       this.listener=listener;   }   // 构造器    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        initPaint();    }    //画笔    private void initPaint() {        paint=new Paint(Paint.ANTI_ALIAS_FLAG);//设置抗锯齿效果        paint.setTextSize(TypedValue.applyDimension(                TypedValue.COMPLEX_UNIT_SP,                11, // 设置字体大小                getResources().getDisplayMetrics()));    }    // 重写绘制方法    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //自定义view分配给每个字符串的高度        int height=getHeight()/letter.length;        //自定义view分配给每个字符串的宽度        int width=getWidth();        //利用循环全部绘制出来        for(int i=0;i<letter.length;i++){            Rect bounds=new Rect();            paint.getTextBounds(letter[i], 0, letter[i].length(), bounds);            //横坐标            float x=width/2-bounds.width()/2;            //纵坐标            float y=height/2+bounds.height()/2+height*i;            // 绘制字体            canvas.drawText(letter[i], x, y, paint);        }    }       // 重写,触摸事件这个方法        @Override        public boolean onTouchEvent(MotionEvent event) {           int action=event.getAction();           // 四个触摸事件:落下,移动,抬起,取消        switch (action) {        //这里只写了按下和移动        case MotionEvent.ACTION_DOWN:        case MotionEvent.ACTION_MOVE:            //添加灰色背景            setBackgroundColor(Color.LTGRAY);            //根据手指当前位置换算出当前手指所在的字符            float ypos=event.getY();            int idx=(int) ((ypos*letter.length)/getHeight());            //设置监听器,利用回调方法,把字符传过去            if(idx>=0&&idx<letter.length){                if(listener!=null){                    listener.onTouchsetLetter(letter[idx]);                }            }            break;        default:            setBackgroundColor(Color.TRANSPARENT);//透明色            break;        }            return true;        }    // 内部接口,监听器,    public interface OnTouchLetterListener{        void onTouchsetLetter(String letter);    }}`

回调方法的使用:即在listview显示的分组界面进行调用

myview.setOnTouchListener(new OnTouchLetterListener() {            @Override            public void onTouchsetLetter(String letter) {                if(letter.equals("热门")){                    listview.setSelection(0);                }else{                    char section=letter.charAt(0);                    listview.setSelection(adapter.getPositionForSection(section));                }            }        });
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胆囊炎是怎样引起的 肾积水是怎么引起的 肾囊肿是怎么引起的 痛风是由什么引起的 疱疹什么原因引起的 皮肤藓是怎么引起的 脸部疱疹怎么引起的 脑膜瘤是怎么引起的 阴毛囊炎怎么引起的 脚痛风是怎么引起的 寻常疣是什么引起的 脂肪瘤是怎么引起的 脑垂体瘤是什么引起的 腰痛是什么原因引起的 坐骨神经痛怎么引起的 传染性软疣怎么引起的 左背痛是什么原因引起的 脑供血不足是怎么引起的 手臂发麻是什么原因引起的 小腿浮肿是什么原因引起的 腰椎管狭窄怎么引起的 脚后跟疼是什么原因引起的 腿痛有哪些原因引起 末梢神经炎怎么引起的 腿浮肿是什么原因引起的 血糖高是什么原因引起的 腰椎滑脱是什么引起的 坐骨神经痛是怎么引起的 肾功能不全怎么引起的 腰困是什么原因引起的 腰肌劳损是怎么引起的 泡疹是什么原因引起的 嘴唇疱疹是怎么引起的 肾功能衰竭是怎么引起的 带状疱疹是什么引起 坐骨神经痛是怎样引起的 病毒性软疣怎么引起的 坐骨神经疼是什么引起的 坐骨神经是怎么引起的 腰椎管狭窄是什么引起的 病毒性疱疹怎么引起的