Android 自定义UI-垂直方向的SeekBar

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

代码如下:

[java] view
plain
copy

  1. package android.widget;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.util.AttributeSet;  
  6. import android.util.Log;  
  7. import android.view.MotionEvent;  
  8.   
  9. public class VerticalSeekBar extends SeekBar {  
  10.   
  11.     public VerticalSeekBar(Context context) {  
  12.         super(context);  
  13.     }  
  14.   
  15.     public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {  
  16.         super(context, attrs, defStyle);  
  17.     }  
  18.   
  19.     public VerticalSeekBar(Context context, AttributeSet attrs) {  
  20.         super(context, attrs);  
  21.     }  
  22.   
  23.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  24.         super.onSizeChanged(h, w, oldh, oldw);  
  25.     }  
  26.   
  27.     @Override  
  28.     protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  29.         super.onMeasure(heightMeasureSpec, widthMeasureSpec);  
  30.         setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());  
  31.     }  
  32.   
  33.     protected void onDraw(Canvas c) {  
  34.         //将SeekBar转转90度  
  35.         c.rotate(-90);  
  36.         //将旋转后的视图移动回来  
  37.         c.translate(-getHeight(),0);  
  38.         Log.i("getHeight()",getHeight()+"");  
  39.         super.onDraw(c);  
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean onTouchEvent(MotionEvent event) {  
  44.         if (!isEnabled()) {  
  45.             return false;  
  46.         }  
  47.   
  48.         switch (event.getAction()) {  
  49.             case MotionEvent.ACTION_DOWN:  
  50.             case MotionEvent.ACTION_MOVE:  
  51.             case MotionEvent.ACTION_UP:  
  52.                 int i=0;  
  53.                 //获取滑动的距离  
  54.                 i=getMax() - (int) (getMax() * event.getY() / getHeight());  
  55.                 //设置进度  
  56.                 setProgress(i);  
  57.                 Log.i("Progress",getProgress()+"");  
  58.                 //每次拖动SeekBar都会调用  
  59.                 onSizeChanged(getWidth(), getHeight(), 0, 0);  
  60.                 Log.i("getWidth()",getWidth()+"");  
  61.                 Log.i("getHeight()",getHeight()+"");  
  62.                 break;  
  63.   
  64.             case MotionEvent.ACTION_CANCEL:  
  65.                 break;  
  66.         }  
  67.         return true;  
  68.     }  
  69.       
  70. }  

  xml布局文件:

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:gravity="center"  
  6.     android:background="@android:color/white"  
  7.     android:orientation="horizontal" >  
  8.   
  9.     <android.widget.VerticalSeekBar_Reverse  
  10.         android:id="@+id/seekbar_reverse"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="450dip"  
  13.         android:layout_marginRight="30dip" />  
  14.   
  15.     <TextView  
  16.         android:id="@+id/reverse_sb_progresstext"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_below="@+id/seekbar_reverse"  
  20.         android:gravity="center" />  
  21.   
  22.     <android.widget.VerticalSeekBar  
  23.         android:id="@+id/vertical_Seekbar"  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="450dip"  
  26.         android:layout_toRightOf="@+id/seekbar_reverse" />  
  27.   
  28.     <TextView  
  29.         android:id="@+id/vertical_sb_progresstext"  
  30.         android:layout_width="wrap_content"  
  31.         android:layout_height="wrap_content"  
  32.         android:layout_below="@+id/vertical_Seekbar"  
  33.         android:layout_toRightOf="@+id/seekbar_reverse"  
  34.         android:gravity="center" />  
  35.   
  36. </RelativeLayout>  

  

  代码下载

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

时间: 2024-09-16 15:34:28

Android 自定义UI-垂直方向的SeekBar的相关文章

Android自定义UI手势密码改进版_Android

接着第一个Android UI手势密码设计的基础上继续改进,效果图如下 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layo

Android自定义UI手势密码改进版源码下载_Android

在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 源码下载:http://xiazai.jb51.net/201610/yuanma/androidLock(jb51.net).rar 先看第一张图片的布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

Android自定义UI实现微信语音_Android

本文实例为大家分享了java获取不同路径的方法,供大家参考,具体内容如下 思路: 自定义Button 获取DialogManager.AudioManager setOnLongClickListener长按事件--做好AudioManager的录音准备工作 AudioManager.setOnAudioStateListener(this)实现录音准备完毕的接口回调方法,方法中去发送MSG_AUDIO_PREPARE消息代表录音准备工作完毕 在mHandler中接收消息,开始开启线程录音,并且

Android自定义UI手势密码终结版_Android

之前写过3篇手势密码的demo,不过没有集成到真实的企业项目中,这几天正好领到一个手势密码项目,昨天刚好弄完,今天抽空整理下,目前还没有完善,有一些地方需要更改,不过基本的流程都可以跑通了. 源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidGestureLock(jb51.net).rar 先看主界面的入口把.里面有2个button(一个是设置手势密码.一个是校验手势密码) activity_main.xml <RelativeLayout

Android自定义UI手势密码简单版_Android

先看看效果图: ImageLockActivity package com.example.imagelock; import com.example.view.NinePointLineView; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; public class ImageLockActivity extends Acti

Android自定义UI手势密码改进版源码下载

在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 源码下载:http://xiazai.jb51.net/201610/yuanma/androidLock(jb51.net).rar 先看第一张图片的布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

Android自定义竖直方向SeekBar多色进度条_Android

写在前面 因为有这样的一个场景,需要实现竖直方向的多色进度条,然后在网上也找了下,没看到符合需要的,于是自定义了一个,效果如下: 具体实现 本来想定义水平的,然后旋转一下,后来发现还不如直接定义竖直方向来的直接,就直接在竖直方向画了下. 首先讲一下思路,就是通过继承View,然后通过onDraw()方法进行绘制.具体绘制的时候,需要处理一些小细节. 比如,我们需要画一个圆形的滑动块,那么我们的背景色带就不能把整个宽度占满,要不然,小圆块只能和色带一样宽了,效果不是很好看,所以在绘制的时候应该把背

Android自定义竖直方向SeekBar多色进度条

写在前面 因为有这样的一个场景,需要实现竖直方向的多色进度条,然后在网上也找了下,没看到符合需要的,于是自定义了一个,效果如下: 具体实现 本来想定义水平的,然后旋转一下,后来发现还不如直接定义竖直方向来的直接,就直接在竖直方向画了下. 首先讲一下思路,就是通过继承View,然后通过onDraw()方法进行绘制.具体绘制的时候,需要处理一些小细节. 比如,我们需要画一个圆形的滑动块,那么我们的背景色带就不能把整个宽度占满,要不然,小圆块只能和色带一样宽了,效果不是很好看,所以在绘制的时候应该把背

Android自定义UI手势密码改进版

接着第一个Android UI手势密码设计的基础上继续改进,效果图如下 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layo