一、由于android只定义了横着的SeekBar,所以竖着的SeekBar要由我们自己自定义,现在我来谈谈我自己自定义竖着的SeekBar的做法

竖着的SeekBar有分方向向上和向下,不过代码的区别不是很大,下面会细讲。

步骤:

1、首先要新建一个类来继承AbsSeekBar,类里面再自定义一个监听器接口,比如:OnSeekBarChangeListener(这个名字可以自己定义,我这样只是为了方便)

这个接口里也写三个方法onProgressChanged(SeekBar VerticalSeekBar, int progress,boolean fromUser),onStartTrackingTouch(SeekBar VerticalSeekBar),onStopTrackingTouch(SeekBar VerticalSeekBar)

首先先看android 自带的SeekBar的原理代码

所以根据android自己自带的SeekBar,我们也可以这样定义自己的竖着的SeekBar,但是我要做的是竖着的SeekBar,所以除了它有的这些方法外,我们还要让thumb上下滑动,所以还要有onTouchEvent(),trackTouchEvent(),onProgressRefresh(),setThumbPos()等一些方法。

onTouchEvent()是在View中就有定义的方法,(touch)事件处理我日后有空我会再发文章讨论,现在我们只要知道,在用户触摸seekbar(absseekbar)时,这个方法会响应touch事件就够了。onTouchEvent()会判断用户的动作,然后调用前述的一些方法(注意去看代码),注意它调用的顺序,判断是ACTION_DOWN时先调用onStartTrackingTouch()再调用trackTouchEvent(event),于是在你的程序中定义的 onStartTrackingTouch()先执行了;判断是ACTION_UP时先调用trackTouchEvent(event)再调用onStopTrackingTouch(),至于为什么我就不啰嗦了,有时候这个顺序是很重要的。

trackTouchEvent()根据touch的位置来设置进度,它计算出progress后调用setProgress(),setProgress()是progressbar中实现的方法。

当seekbar的progress改变时onProgressRefresh()会被调用,它会调用setThumbPos()来设置thumb的位置。

现在我们知道,seekbar拥有的progressbar之外的功能,都是在absseekbar中实现的。系统默认seekbar是横着的,在absseekbar中计算progress、计算thumb的位置,用到了seekbar的宽和高,我们只要改变一下计算方法就能计算出竖着的seekbar所需要的各个数值。例如:

2、我们如何画出来一个竖着的seekbar呢?

一是自己画,也就是自己写个draw,太难,而且很难和系统风格统一。另外一个办法是让系统给我们画。verticalseekbar只是seekbar转了90度或-90度,我们可以把画布转一个角度,然后交给系统去画,具体的做法就是在ondraw()时调整画布,然后调用super.onDraw()。

这个调整也就是旋转和平移。至于旋转和平移的具体实现,我跟到native部分就没有看下去了,也没有看到具体的介绍。我的理解,你要保证画布的左上角在旋转平移以后坐标不变,否者会出现很多问题。 就我们的seekbar而言,如果你要获得一个向上增长的seekbar,那么代码应该是:

注意:

一个View在屏幕上画出来,首先measure()会被调用,这是个final方法,measure()会调用onMeasure()。你可以重写onMeasure(),但是重写的onMeasure()中必须调用setMeasuredDimension(int,int), setMeasuredDimension()会保存该View的长和宽。我们可以重写onMeasure()方法给我们的seekbar分配一块竖直的,长宽由我们设定的区域。在画seekbar之前,我们把这个区域旋转了90度交给系统,系统给我们画一个标准的seekbar,在整个layout中,这个seekbar就成竖直的了。

实际操作时,我们在工程中新建了类verticalSeekbar,把framework中seekbar的代码拷贝过来,做一些必须的修改(类名、构造方法什么的)。注意如果我们的verticalseekbar是在XML中定义的,在代码中使用findViewById()方法来获得,系统将使用第二个构造方法(我简单地试了一下,没有看到官方资料或权威的解释),也就是

public SeekBar(Context context, AttributeSet attrs) {

this(context, attrs, com.android.internal.R.attr.seekBarStyle);

}

com.android.internal.R.attr.seekBarStyle在我我们的应用程序中是无法使用的,你可以换成android.R.attr.seekBarStyle,你也可以自己定义一个,但是必须包含系统本身的。

最后代码实现:

方向向上的示例图:

方向向下的示例图:

竖着的seekbar_自定义竖着的SeekBar | 学步园相关推荐

  1. java wcf 未提供用户名_WCF安全之自定义用户名密码验证方式 | 学步园

    概述 Windows Communication Foundation (WCF) 是 Microsoft 为构建面向服务的应用程序而提供的统一编程模型(摘自MSDN),在分布式环境下的安全问题尤为重 ...

  2. java注解获取参数_JAVA 自定义注解及参数获取 | 学步园

    package com.java.annotation; import java.lang.annotation.*; /** * Created by lw on 14-5-30. * 自定义注解 ...

  3. mininet在哪编写python脚本_【SDN专栏】Mininet下编写python,实现自定义的网络topo结构 | 学步园...

    Mininet虚拟机是基于Linux系统的,所以编写步骤与之无异 这里插一句,mininet中有自带的一些例子,在新建python时可以使用 cp 命令 1,打开MIninet,输入:即可看见例子 c ...

  4. 自定义css样式美化博客园

    写在前面 csdn的markdown放到博客园里感觉风格迥异,所以还是找个好点的css吧,css这个我没有深入了解,拼凑了一个css.对于有python代码,而且需要自动生成目录的博文很有帮助,其他的 ...

  5. 教你自定义竖直跑马灯效果(广告专用)

    最近因为项目需要,写了一个跑马灯效果的控件,过程中也学到一些东西,在这里和大家分享一下. 首先让我们来看一下效果: 其中的图标,文字,甚至每行的整个布局都是可以自定义的,我们可以使用整个控件很方便做出 ...

  6. mac外接显示器 竖屏 黑苹果_mac外接显示器 竖屏 黑苹果_Mac 外接显示器转自定义HiDPI分辨率教程...

    Mac 笔记本目前屏幕一直都比较小,相信很多人工作都会给自己配个大一点的显示器,而有些显示器却不能随心所欲的改变分辨率,这点就有点头疼了,还好有些软件可以帮助修改为自己想要的分辨率,当然,前提是显示器 ...

  7. html文字竖直书写,css 文字竖直居中的写法和图片垂直居中代码(图文)

    界面上文章左右居中使用text-aligin:center,上下竖直居中的写法如下, 图片垂直居中的代码 文字.图片居中显示的方法 .content{ height: 40px; line-heigh ...

  8. acivity 横屏_Activity横竖屏切换时先看到横屏/竖屏再变换回竖屏/横屏

    因为公司APP上的一个Bug遇到一个问题,跟了下这个问题,稍微记录一下. 需求:当App从后台回到前台的时候,要弹出一个广告页Activity A ,而广告页希望是竖屏显示的,这样才符合引人入胜的效果 ...

  9. android竖屏固定,ANDROID强制锁定竖屏_APP固定设置竖屏或横屏

    1.XML锁定横屏或竖屏 在没有设置屏幕方向的情况下会默认设置为:android:screenOrientation="unspecified".即未指明屏幕方向.属性取值land ...

  10. 程序猿开启竖屏之路(竖屏的安装和使用)

    竖屏选取: 竖屏种类繁多,这里推荐B站,知乎各大佬认为性价比较高竖屏(明基BL2480T),可以智慧调光,多种模式,3个接口,自带音响,618入手一台,不足千元,有需要可以选取. 普及下小白知识: H ...

最新文章

  1. mxOutlookBarPro中,button是通过for语句动态生成的,如何取得当前单击button的标题呢?...
  2. 动态规划 | 对输入进行hash处理的LIS 1045
  3. jsp超链接中怎么跳转页面跳转页面_在页面点击超链接跳到别的页面,方法是什么?...
  4. 开源项目管理软件 禅道
  5. flex弹性布局操练2
  6. 如何在游戏机制中使用AI/剧情脚本----基于LUA
  7. paip.输入法编程---智能动态上屏码儿长调整--.txt
  8. opencv cv2.copyMakeBorder()函数详解
  9. 【电子技术实验理论】语音放大电路
  10. 流氓软件卸载神器geek
  11. 计算机 在哪看是什么32位,怎么看电脑是32位还是64位?
  12. mysql设置bufferpool_mysql修改buffer_pool大小
  13. 【观察】 通盘无妙手,看SmartX如何构建增长根基
  14. spring cloud NetFlix 学习笔记
  15. android面试自我介绍范文,2022年Android技术下半场在哪
  16. IDEA安装教程及插件推荐
  17. vue-router路由有几种模式?说说它们的区别?
  18. mysql设置值班表_简单的员工轮换值班表
  19. 用java输出m列n行的矩形_C | 输出一个n行m列矩形方阵 发现的几个问题
  20. 记从开始到现在(一)

热门文章

  1. 接口测试面试题及参考答案(汇总),真香
  2. 生信技能树——GEO芯片数据的合并
  3. mybatis中mysql递归查询多级_Mybatis + mysql 实现两级级联的查询
  4. 统信UOS使用wine安装“方正ApabiReader_4.5.2.1790(ceb阅读器)”并解决安装过程中文显示成方块问题
  5. 【裴礼文数学分析】例1.1.2
  6. 【计算摄影】相机成像原理:从光到JPEG图像
  7. 乔姆斯基生成语法_乔姆斯基(乔姆斯基转换生成语法理论)
  8. win10下使用DuetDisplay有线/无线连接,推荐通过爱思助手(非iTunes)更新驱动
  9. linux svn 界面客户端,Linux系统下带图形界面SVN客户端安装过程(Esvn RapidSvn)
  10. Windows下本地安装SVN客户端