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

简介:

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

代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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(), 00);  
  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 在CODE上查看代码片 派生到我的代码片
  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()两个方法的研究
相关文章
|
8天前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
37 0
|
8天前
|
存储 Java Linux
Android Mstar增加IR 自定义遥控头码完整调试过程
Android Mstar增加IR 自定义遥控头码完整调试过程
24 1
|
23天前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
8天前
|
Android开发 芯片
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
25 3
|
8天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
31 1
|
8天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
25 0
|
8天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
23 0
|
9天前
|
Java Android开发
Android Mediatek 禁用拨号应用的部分UI显示
Android Mediatek 禁用拨号应用的部分UI显示
12 0
|
18天前
|
编解码 Android开发 UED
安卓UI/UX设计原则:打造引人入胜的用户体验
【4月更文挑战第13天】本文探讨了安卓UI/UX设计的关键原则,包括一致性、简洁性、反馈、清晰性、效率和适应性。一致性要求视觉和行为保持一致,利用系统UI;简洁性减少用户行动,简化导航;反馈需即时且明确;清晰性强调表达清晰,布局有序;效率关注性能优化和任务简化;适应性涉及多设备适配和用户多样性。遵循这些原则,可创建出色应用,提供无缝用户体验。设计应持续迭代,适应技术发展和用户需求。
|
19天前
|
XML 数据可视化 Android开发
深入探究Android中的自定义View组件开发
【4月更文挑战第12天】在安卓应用开发中,创建具有独特交互和视觉表现的自定义View组件是增强用户体验的重要手段。本文将详细阐述如何从头开始构建一个Android自定义View,包括理解View的工作原理、处理绘制流程、事件分发机制以及属性的自定义与管理。通过具体案例分析,我们将一步步实现一个可定制的动态进度条,不仅具备基础功能,还能根据业务需求进行扩展,体现高度的产品个性化。