系统自带的SeekBar样式是水平的,如果需求一个垂直方向的效果就需要自定义了。原理很简单,即定义一个类继承于SeekBar,并在OnDraw方法里面旋转一下视图。

代码如下:

package android.widget;import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;public class VerticalSeekBar extends SeekBar {public VerticalSeekBar(Context context) {super(context);}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public VerticalSeekBar(Context context, AttributeSet attrs) {super(context, attrs);}protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(h, w, oldh, oldw);}@Overrideprotected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(heightMeasureSpec, widthMeasureSpec);setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());}protected void onDraw(Canvas c) {//将SeekBar转转90度c.rotate(-90);//将旋转后的视图移动回来c.translate(-getHeight(),0);Log.i("getHeight()",getHeight()+"");super.onDraw(c);}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (!isEnabled()) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:case MotionEvent.ACTION_UP:int i=0;//获取滑动的距离i=getMax() - (int) (getMax() * event.getY() / getHeight());//设置进度setProgress(i);Log.i("Progress",getProgress()+"");//每次拖动SeekBar都会调用onSizeChanged(getWidth(), getHeight(), 0, 0);Log.i("getWidth()",getWidth()+"");Log.i("getHeight()",getHeight()+"");break;case MotionEvent.ACTION_CANCEL:break;}return true;}}

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:background="@android:color/white"android:orientation="horizontal" ><android.widget.VerticalSeekBar_Reverseandroid:id="@+id/seekbar_reverse"android:layout_width="wrap_content"android:layout_height="450dip"android:layout_marginRight="30dip" /><TextViewandroid:id="@+id/reverse_sb_progresstext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/seekbar_reverse"android:gravity="center" /><android.widget.VerticalSeekBarandroid:id="@+id/vertical_Seekbar"android:layout_width="wrap_content"android:layout_height="450dip"android:layout_toRightOf="@+id/seekbar_reverse" /><TextViewandroid:id="@+id/vertical_sb_progresstext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/vertical_Seekbar"android:layout_toRightOf="@+id/seekbar_reverse"android:gravity="center" /></RelativeLayout>
代码下载

推荐博文: Android Canvas编程:对rotate()和translate()两个方法的研究

Android 自定义UI-垂直方向的SeekBar相关推荐

  1. android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...

  2. android 触摸监听重写_第六十四回:Android中UI控件之SeekBar

    各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...

  3. android自定义UI模板图文详解

    不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一 ...

  4. Android 自定义UI 实战 02 流式布局

    Android 自定义UI 实战 02 流式布局-- 自定义ViewGroup 第二章 自定义ViewGroup 流式布局 文章目录 Android 自定义UI 实战 02 流式布局-- 自定义Vie ...

  5. Android开发之如何自定义垂直方向的SeekBar

    SeekBar进度条在项目开发过程中使用的太频繁了,比如媒体播放器当前播放的时间进度等.那么今天将对seekbar的使用做一个总结,后面写工作要用到直接过来copy就好.这边seekbar的使用分为横 ...

  6. Android自定义UI实例

    下面开始实现一个闪屏的效果,首先自定义类继承于View,然后重写onDraw方法,之前使用onDraw方法可以绘图,但是只是绘制一次,那如何实现循环呢.很容易想到使用invalidate()这个方法, ...

  7. Android自定义UI陷阱:LayoutInflater.from().inflate()一定不能工作在父类或虚类里

    问题背景:有一些UI具有共性,比如常见的app第一次运行时出现的各种指示框,告诉你往哪搓是调音量的,往哪点是调屏幕亮度的,当点击这些VIew,则其自动消失.或者一动时间后,自动消失.另外一个问题是,不 ...

  8. Android自定义UI陷阱 LayoutInflater from inflate 一定不能工作在父类或虚类里

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 问题背景 ...

  9. android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动

    一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...

最新文章

  1. 纳米孔测序高错误区域恢复率高达99%,肖传乐/刘奕志/王建新等在Nature子刊发表新校正组装算法
  2. 如何获取字符串的最后一个字符?
  3. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
  4. 匿名函数php作用,PHP匿名函数可以干什么用
  5. kettlejava脚本的api_[翻译]KETTLE JAVA API :编程定制自己的Kettle转换(transformation)...
  6. 满月啦,Linux公众号!
  7. 华为 eNSP启动设备AR1失败 错误代码40
  8. 如何避免“被贷款”影响个人信用记录?
  9. hiberfil.sys是什么文件?可以删除吗?
  10. html什么用于创建表格的标题,在HTML页面中,()标记用于为表格中的一列指定一个标题(选一项)...
  11. 199美元的iPhone和磨刀霍霍的程序员
  12. Java中double类型保留两位小数
  13. 防火墙规则应用同一子网计算机,防火墙基础(一)
  14. Kaggle教程 机器学习中级7 数据泄露
  15. STL 大理石在那儿
  16. DeepFashion服装检索及代码实现
  17. 经济管理学入门书籍推荐
  18. 循环移位之循环左移和循环右移
  19. 史上最全的微信运营架构思维导图
  20. PL2303HX----Family Software Newsletter #37 - (Updated 08/05/2017)

热门文章

  1. DeepMind智能体自学跑酷:略显智障,结果尚好
  2. centos7.3 kvm虚拟化全自动化部署(0915金测OK)
  3. Android第二十四期 - 游戏公告跑马灯效果
  4. 人工智能 VS 机器学习 VS 深度学习
  5. 小白该如何学习Linux操作系统(1)
  6. [原]接上-Linux环境-Jenkins实战-分布式构建-自动化持续集成(二)SVN构建及发布
  7. 为什么要用 SpringMVC 的 SessionStatus
  8. Windows无法安装到这个磁盘。请确保在计算机的BIOS菜单中启用了磁盘控制器
  9. SharePoint创建登录表单
  10. Codeforces Round #321 (Div. 2)