横向TimePicker-带三角指示器

news/2024/7/24 10:10:03

插件比较复杂,先描述下功能。
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);
        }

  

 源码:http://files.cnblogs.com/feifei1010/BottomBar.rar

 

欢迎关注微博:http://e.weibo.com/u/2975543812

 

 

转载于:https://www.cnblogs.com/feifei1010/archive/2012/09/20/2694942.html


http://www.niftyadmin.cn/n/1319236.html

相关文章

react navigation 5.x 如何在UI组件之外访问navigation

有时&#xff0c;需要从无法访问navigation的地方&#xff0c;在这种情况下&#xff0c;可以从导航容器中存储导航ref import NavigationService from ../service/navigationServiceclass App extends React.Component {render() {return (<NavigationContainer ref{navigat…

JS中定义对象的几种方式

1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)&#xff1a; <html> <head><title>基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)</title> </head> <script>var obj new Object();obj.name"userObject&…

notepad++ 样式随我变!

使用Notepad编辑器也很长时间了&#xff0c;一直都觉得其背景及文字显示上不舒服&#xff0c;可每次打开‘设置’页面时&#xff0c;我都会失望&#xff0c;里面根本就没有设置试图背景、文字的地方&#xff1f;&#xff01;以前很懒&#xff0c;懒得找原因&#xff0c;因为用的…

用JS实现一个JS对象,对象里有两个属性一个方法

<html> <head> </head> <body> 用js代码实现一个js对象&#xff0c;对象里有两个属性&#xff0c;一个方法 </body> <script> var obj{a:1234567,b:bbbbbbbbbb,c:function(x){ alert(我是函数c,我的同伴有&#xff1a;this.a和this.b\n\n你…

react-native-wechat 安卓配置

1.添加两个文件 路径 ‘项目名\android\app\src\main\java\com\项目名’ 下 新建文件名wxapi 新建文件名 WXEntryActivity.java package com.innovationvalley.wxapi; import android.app.Activity; import android.os.Bundle; import com.theweflex.react.WeChatModu…

How to Type HDU 2557

题意&#xff1a;给你一串字符串&#xff0c;只包含大写字母和小写字母&#xff0c;问打出这串字符最少要按多少次键。但如果Caps Lock键最后是打开的一定要把Caps Lock键关掉。 题解&#xff1a;首先你要知道1.当Caps Lock键关闭的时候打出一个大写字母可以有两种方法&#xf…

linux查看硬件信息的命令

linux查看硬件信息的命令 一.查看CPU&#xff1a; cat /proc/cpuinfo 二.查看内存&#xff1a; free 三.查看硬盘&#xff1a; df linux下查看硬件信息 1、lspci 列出所有PCI 设备&#xff1b; lspci - list all PCI devices:列出机器中的PCI设备&#xff08;声卡、显卡、Modem…

react-native-alipay 安卓配置

1.在android/build.gradle 里面 allprojects 找到 repositories 下添加 flatDir {dirs "$rootDir/../node_modules/0x5e/react-native-alipay/android/libs"} 2.在android/app/proguard-rules.pro下添加 -keep class com.alipay.** { *; } 两部即可