Android 自定义UI-垂直方向的SeekBar
系统自带的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相关推荐
- android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...
- android 触摸监听重写_第六十四回:Android中UI控件之SeekBar
各位看官们,大家好,上一回中咱们说的是Android中UI控件之ProgressBar的例子,这一回咱们的例子是UI控件之SeekBar.闲话休提,言归正转.让我们一起Talk Android吧! 看 ...
- android自定义UI模板图文详解
不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一 ...
- Android 自定义UI 实战 02 流式布局
Android 自定义UI 实战 02 流式布局-- 自定义ViewGroup 第二章 自定义ViewGroup 流式布局 文章目录 Android 自定义UI 实战 02 流式布局-- 自定义Vie ...
- Android开发之如何自定义垂直方向的SeekBar
SeekBar进度条在项目开发过程中使用的太频繁了,比如媒体播放器当前播放的时间进度等.那么今天将对seekbar的使用做一个总结,后面写工作要用到直接过来copy就好.这边seekbar的使用分为横 ...
- Android自定义UI实例
下面开始实现一个闪屏的效果,首先自定义类继承于View,然后重写onDraw方法,之前使用onDraw方法可以绘图,但是只是绘制一次,那如何实现循环呢.很容易想到使用invalidate()这个方法, ...
- Android自定义UI陷阱:LayoutInflater.from().inflate()一定不能工作在父类或虚类里
问题背景:有一些UI具有共性,比如常见的app第一次运行时出现的各种指示框,告诉你往哪搓是调音量的,往哪点是调屏幕亮度的,当点击这些VIew,则其自动消失.或者一动时间后,自动消失.另外一个问题是,不 ...
- Android自定义UI陷阱 LayoutInflater from inflate 一定不能工作在父类或虚类里
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 问题背景 ...
- android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动
一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...
最新文章
- 纳米孔测序高错误区域恢复率高达99%,肖传乐/刘奕志/王建新等在Nature子刊发表新校正组装算法
- 如何获取字符串的最后一个字符?
- oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
- 匿名函数php作用,PHP匿名函数可以干什么用
- kettlejava脚本的api_[翻译]KETTLE JAVA API :编程定制自己的Kettle转换(transformation)...
- 满月啦,Linux公众号!
- 华为 eNSP启动设备AR1失败 错误代码40
- 如何避免“被贷款”影响个人信用记录?
- hiberfil.sys是什么文件?可以删除吗?
- html什么用于创建表格的标题,在HTML页面中,()标记用于为表格中的一列指定一个标题(选一项)...
- 199美元的iPhone和磨刀霍霍的程序员
- Java中double类型保留两位小数
- 防火墙规则应用同一子网计算机,防火墙基础(一)
- Kaggle教程 机器学习中级7 数据泄露
- STL 大理石在那儿
- DeepFashion服装检索及代码实现
- 经济管理学入门书籍推荐
- 循环移位之循环左移和循环右移
- 史上最全的微信运营架构思维导图
- PL2303HX----Family Software Newsletter #37 - (Updated 08/05/2017)
热门文章
- DeepMind智能体自学跑酷:略显智障,结果尚好
- centos7.3 kvm虚拟化全自动化部署(0915金测OK)
- Android第二十四期 - 游戏公告跑马灯效果
- 人工智能 VS 机器学习 VS 深度学习
- 小白该如何学习Linux操作系统(1)
- [原]接上-Linux环境-Jenkins实战-分布式构建-自动化持续集成(二)SVN构建及发布
- 为什么要用 SpringMVC 的 SessionStatus
- Windows无法安装到这个磁盘。请确保在计算机的BIOS菜单中启用了磁盘控制器
- SharePoint创建登录表单
- Codeforces Round #321 (Div. 2)