zoukankan      html  css  js  c++  java
  • 横向TimePicker带三角指示器

     

    转自http://www.apkbus.com/

    值得推荐的活动:1.写博客推荐高薪工作 写博客送小米2代&魅族MX

                                2.转帖就送30下载豆

                                3.关注http://weibo.com/u/2975543812得好礼

    插件比较复杂,先描述下功能。
    1.可横向滚动
    2.数值可自定义。
    3.要求有三角指示器,指向当前焦点
    4.点击后焦点改变,并且三角指示器可滑动变化
    5.焦点滚动至最左或最右时不消失(这里使用新的view获取焦点view的值悬浮显示,滚动条中的view已经还是滚动消失了)

    上效果图,上面使用ImageView作为子View,下面使用TextView作为子View。

    布局说明:
    1.底部滚动条TimeBar继承自HorizontalScrollView,在onDraw()中添加三角指示器(三角滑块)绘制代码,使指示器随焦点滑动。

      @Override
                    public void onDraw(Canvas canvas) {
                            super.onDraw(canvas);
                            //Log.d("Validated!", "Should not always validate");
                            if (mSelectedView != null){
                                    int step = getWidth()/30;
                                    canvas.drawColor(Color.BLACK);
                                    paint = new Paint();
                                    paint.setAntiAlias(true);
                                    paint.setColor(Color.LTGRAY);
                                    paint.setStyle(Paint.Style.FILL);
                                    if (curTriangle == null){
                                            curTriangle = new Triangle(
                                                            mSelectedView.getLeft() + mSelectedView.getWidth()/2 - 10,
                                                            mSelectedView.getTop() - 4,
                                                            mSelectedView.getLeft() + mSelectedView.getWidth()/2 + 10,
                                                            mSelectedView.getTop() + 13.3f
                                                            );
                                    }
                                    if (tarTriangle == null){
                                            tarTriangle = new Triangle(
                                                            mSelectedView.getLeft() + mSelectedView.getWidth()/2 - 10,
                                                            mSelectedView.getTop() - 4,
                                                            mSelectedView.getLeft() + mSelectedView.getWidth()/2 + 10,
                                                            mSelectedView.getTop() + 13.3f
                                                            );
                                    }
                                    
                                    if (Math.abs(curTriangle.left - tarTriangle.left) < step) {
                                            curTriangle.left = tarTriangle.left;
                                            curTriangle.right = tarTriangle.right;
                                            curTriangle.reDraw();
                                    }
                                    
                                    if (curTriangle.left > tarTriangle.left){
                                            curTriangle.left -= step;
                                            curTriangle.right -= step;
                                            curTriangle.reDraw();
                                            invalidate();
                                    }
                                    else if (curTriangle.left < tarTriangle.left) {
                                            curTriangle.left += step;
                                            curTriangle.right += step;
                                            curTriangle.reDraw();
                                            invalidate();
                                    }
                                    canvas.drawPath(curTriangle.getPath(), paint);
                            }
                    }
            }
    

    2.左右各添加一个TimePanel,继承自LinearLayout,重载onDraw()方法, 绘制出三角指示器,相对于上面的绘制代码较简单,不需要处理滑动情况,仅绘制出三角即可。

      @Override
                    protected void onDraw(Canvas canvas) {
                            super.onDraw(canvas);
                            canvas.drawColor(Color.BLACK);
                            paint.setColor(Color.LTGRAY);
                            paint.setStyle(Paint.Style.FILL);
                            if (curTriangle == null){
                                    curTriangle = new Triangle(
                                                    mTextView.getLeft() + mTextView.getWidth()/2 - 10,
                                                    mTextView.getTop() - 4,
                                                    mTextView.getLeft() + mTextView.getWidth()/2 + 10,
                                                    mTextView.getTop() + 13.3f
                                                    );
                            }
                            canvas.drawPath(curTriangle.getPath(), paint);
                    }
                    
    

    3.TimePicker作为一个容器,容纳TimeBar和左右各一的TimePanel,重载onDraw()方法,在其中加入TimePanel显示和隐藏的判断条件。

     @Override
            protected void onDraw(Canvas canvas) {
                    super.onDraw(canvas);
                    int x = timeBar.getScrollX();
                    focusedBtn = (TextView)timeBar.getSelectedView();
                    if (focusedBtn != null){
                            if (focusedBtn.getLeft() - x < 0){
                                    ((TextView)timePanelLeft.getChildTextView()).setText(focusedBtn.getText());
                                    timePanelLeft.setVisibility(View.VISIBLE);
                                    timePanelRight.setVisibility(View.GONE);
                            } else if (focusedBtn.getRight() - x  > getWidth()){
                                    ((TextView)timePanelRight.getChildTextView()).setText(focusedBtn.getText());
                                    timePanelRight.setVisibility(View.VISIBLE);
                                    timePanelLeft.setVisibility(View.GONE);
                            } else{
                                    timePanelRight.setVisibility(View.GONE);
                                    timePanelLeft.setVisibility(View.GONE);
                            }
                    }
            }
    

    4.仍需重载TimePicker中的dispatchTouchEvent (ev),将点击事件传递给timeBar,否则会发现timeBar无法响应点击事件。

     @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {
                    timeBar.onTouchEvent(ev);
                    return super.dispatchTouchEvent(ev);
            }
    

    源码:BottomBar.rar

    安卓巴士广州群252743081
    安卓巴士广州超级群218251417
    安卓巴士南京群 220818530
    安卓巴士上海群252742977
    安卓巴士深圳群252742753(已满)
    安卓巴士深圳群之二 260134856
    安卓巴士成都群 252743807
    安卓巴士北京群111059554
    安卓巴士西安群252746034
    安卓巴士武汉群121592153
    安卓巴士杭州群253603803
    安卓巴士厦门群253604146 
    安卓巴士湖南群217494504
    安卓巴士大连群253672904
    安卓巴士青岛群 257925319 
  • 相关阅读:
    Java 学习笔记- classpath classpath*
    Java this关键字 学习笔记
    Java 基础 类加载器和双亲委派机制 学习笔记
    《Java语言实现快速幂取模》
    《2017年内蒙古自治区第十二届大学生程序设计-超级密码》
    《快速排序》
    《01-背包问题-点菜》
    微信小程序相关二、css介绍,菜单制作,表单相关,京东注册页面
    微信小程序相关一、模仿京东静态登录页面
    分别用js和css实现瀑布流
  • 原文地址:https://www.cnblogs.com/tijing/p/2670638.html
Copyright © 2011-2022 走看看