主要是继承 AbsSeekBar 然后修改下面这些方法

onProgressRefresh() //当进度条数据更新的时候,例如我们拖动滑动条的时候,这个方法被调用

setThumbPos() //这个方法是设置Thumb的位置

onDraw() //这个是负责画界面

onSizeChanged() //更新画布尺寸

onTouchEvent() //当触摸屏幕的时候被调用

trackTouchEvent() //当拖动滑动条的时候,这个被调用

还有就是添加一个接口这个接口是SeekBar 的一个内部接口 public interface OnSeekBarChangeListener

里面有三个方法:

public void onProgressChanged(VerticalSeekBar vBar, int progress,boolean fromUser);
public void onStartTrackingTouch(VerticalSeekBar vBar);
public void onStopTrackingTouch(VerticalSeekBar vBar);

这个接口主要是为外部提供监听。多说无益,大家看源代码明白一点。

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsSeekBar;
import android.widget.SeekBar;  public class VerticalSeekBar extends AbsSeekBar {   private int height = -1;  private int width = -1;  public interface OnSeekBarChangeListener  {  public void onProgressChanged(VerticalSeekBar vBar, int progress,boolean fromUser);  public void onStartTrackingTouch(VerticalSeekBar vBar);  public void onStopTrackingTouch(VerticalSeekBar vBar);  }  private OnSeekBarChangeListener mOnSeekBarChangeListener;  public VerticalSeekBar(Context context)  {  this(context, null);  }  public VerticalSeekBar(Context context, AttributeSet attrs)  {  this(context, attrs, android.R.attr.seekBarStyle);  }  public VerticalSeekBar(Context context, AttributeSet attrs, int defstyle)  {  super(context, attrs, defstyle);  }  public void setOnSeekBarChangeListener(OnSeekBarChangeListener l)  {  mOnSeekBarChangeListener = l;  }  void onStartTrackingTouch()  {  if (mOnSeekBarChangeListener != null)  {  mOnSeekBarChangeListener.onStartTrackingTouch(this);  }  }  void onStopTrackingTouch()  {  if (mOnSeekBarChangeListener != null)  {  mOnSeekBarChangeListener.onStopTrackingTouch(this);  }  }  void onProgressRefresh(float scale, boolean fromUser)  {  Drawable thumb = null;  try  {  Field mThumb_f = this.getClass().getSuperclass().getDeclaredField("mThumb");  mThumb_f.setAccessible(true);  thumb = (Drawable)mThumb_f.get(this);  }  catch (Exception e)  {  e.printStackTrace();  }  setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE);  invalidate();  if (mOnSeekBarChangeListener != null) {  mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser);  }  }  private void setThumbPos(int w, Drawable thumb, float scale, int gap)  {  int available = 0;  try  {  int up = getPaddingTop();  int bottom = getPaddingBottom();  available = getHeight() - up - bottom;  int thumbWidth = thumb.getIntrinsicWidth();  int thumbHeight = thumb.getIntrinsicHeight();  available -= thumbWidth;  //The extra space for the thumb to move on the track  available += getThumbOffset() * 2;  int thumbPos = (int) (scale * available);  int topBound, bottomBound;  if (gap == Integer.MIN_VALUE) {  Rect oldBounds = thumb.getBounds();  topBound = oldBounds.top;  bottomBound = oldBounds.bottom;  } else {  topBound = gap;  bottomBound = gap + thumbHeight;  }  // Canvas will be translated, so 0,0 is where we start drawing  thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);      }  catch (Exception e)  {  e.printStackTrace();  }  }  protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  {       width = 30;  height = View.MeasureSpec.getSize(heightMeasureSpec);  this.setMeasuredDimension(width, height);   }   protected void onDraw(Canvas c)  {  c.rotate(-90);  c.translate(-height,0);   super.onDraw(c);  }  protected void onSizeChanged(int w, int h, int oldw, int oldh)  {       super.onSizeChanged(h, w, oldw, oldh);   }   @Override  public boolean onTouchEvent(MotionEvent event)  {  boolean mIsUserSeekable=true;  try  {  Field mIsUserSeekable_f = this.getClass().getSuperclass().getDeclaredField("mIsUserSeekable");  mIsUserSeekable_f.setAccessible(true);  mIsUserSeekable = mIsUserSeekable_f.getBoolean(this);  }  catch (Exception e1)  {  e1.printStackTrace();  }  if (!mIsUserSeekable || !isEnabled()) {  return false;  }  switch (event.getAction()) {  case MotionEvent.ACTION_DOWN:  setPressed(true);  onStartTrackingTouch();  trackTouchEvent(event);  break;  case MotionEvent.ACTION_MOVE:  trackTouchEvent(event);  Method attemptClaimDrag;  try  {  attemptClaimDrag = this.getClass().getSuperclass().getDeclaredMethod("attemptClaimDrag");  attemptClaimDrag.setAccessible(true);  attemptClaimDrag.invoke(this);  }  catch (Exception e)  {  e.printStackTrace();  }  break;  case MotionEvent.ACTION_UP:  trackTouchEvent(event);  onStopTrackingTouch();  setPressed(false);  // ProgressBar doesn't know to repaint the thumb drawable  // in its inactive state when the touch stops (because the  // value has not apparently changed)
                invalidate();  break;  case MotionEvent.ACTION_CANCEL:  onStopTrackingTouch();  setPressed(false);  invalidate(); // see above explanation  break;  }  return true;  }  protected void trackTouchEvent(MotionEvent event)  {  final int height = getHeight();  final int available = height - getPaddingLeft() - getPaddingRight();  int y = (int)(height - event.getY());  float scale;  float progress = 0;  if (y < getPaddingLeft()) {  scale = 0.0f;  } else if (y > height - getPaddingRight()) {  scale = 1.0f;  } else {  scale = (float)(y - getPaddingLeft()) / (float)available;  float mTouchProgressOffset = 0.0f;  try  {  Field mTouchProgressOffset_f = this.getClass().getSuperclass().getDeclaredField("mTouchProgressOffset");  mTouchProgressOffset_f.setAccessible(true);  mTouchProgressOffset = mTouchProgressOffset_f.getFloat(this);  }  catch(Exception e)  {  e.printStackTrace();  }  progress = mTouchProgressOffset;  }  final int max = getMax();  progress += scale * max;  try  {  Method setProgress = this.getClass().getSuperclass().getSuperclass().getDeclaredMethod("setProgress", int.class,boolean.class);  setProgress.setAccessible(true);  setProgress.invoke(this, (int)progress, true);  }  catch(Exception e)  {  e.printStackTrace();  }  }
}  

[转载链接地址]http://blog.csdn.net/failure01/article/details/8577675

转载于:https://www.cnblogs.com/yihujiu/p/5760047.html

android 垂直 SeekBar 源代码(VerticalSeekBar)[转]相关推荐

  1. Android自定义垂直 SeekBar

    概述 android 本身只有一个水平的 seekbar,开发需要使用垂直的seekbar就只能自己实现了,好在可以直接继承水平seekbar,修改几个重载事件即可 忘了放图了,补上 默认水平Seek ...

  2. Android自定义Seekbar拖动条式样

    SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...

  3. android-verticalseekbar——Android可视化SeekBar类库

    android-verticalseekbar--Android可视化SeekBar类库 转载于:https://www.cnblogs.com/zhujiabin/p/5706246.html

  4. Android使用SeekBar

    转自:http://my.oschina.net/pingdy/blog/376735 最近有做一个android项目,里面有使用到在播放视频时可以跳播,同时动态显示播放时间.类似于下图 的效果,我只 ...

  5. android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题

    开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...

  6. Android manifest 获取源代码

    /********************************************************************************** Android manifest ...

  7. android studio seekbar 简单音乐播放器

    我这个seekbar比较简单,是访问自己放进raw文件里的音乐文件:通过Mediapaly实现后台播放. 用if语句判断图片实现切换歌曲,seekbar可以拖动歌曲进度,用 Duration=mp4. ...

  8. android 远程视频监控程序源码,详解基于Android已开放源代码的远程视频监控系统教程...

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.Socket的英文原义是"孔"或"插座".通常也称作"套接字 ...

  9. Android按钮滚动条,Android自定义Seekbar滑动条,Pop提示跟随滑动按钮一起滑动

    由于项目需要做出此效果,自定义写了一个. 效果图 思路: 原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件. 代码: 在values文件夹下新建attr ...

最新文章

  1. 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...
  2. struts2学习笔记(二):Struts2配置
  3. MySQL 全文索引实现简单版搜索引擎
  4. 作者:刘强强(1992-),男,贵州大学公共管理学院硕士生。
  5. python获取绝对路径的区别_python 获取路径不同方法的比较
  6. 语音识别(3)---语音识别技术原理
  7. Net需要掌握的知识
  8. apache php 分离mysql_Apache、php、mysql单独安装配置
  9. 英国野生生物摄影奖之一个地球奖
  10. 步进电机驱动技术3:基于ULN2003的步进电机驱动
  11. The CATALINA_HOME environment variable is not defined correctly
  12. Android 短视频SDK
  13. 【XAI】Comment: Graphical Models, Causality and Intervention
  14. 如何找回Nessus密码?
  15. 同一个用户异地登陆踢人操作
  16. java配置环境变量path(JAVA配置环境变量失败)
  17. FE_CSS 页面布局之定位
  18. 多线程并发下集合不安全类-ArrayList
  19. vue3(vite)设置代理,封装axios,api解耦
  20. 中国传媒大学博士申请初试准备经验(文科+工科)(2022)

热门文章

  1. iOS压缩动画 CGAffineTransform
  2. Golang二进制转换十进制代码
  3. javascript--------this探险
  4. JAVA中的方法和构造方法有什么区别
  5. SQL JOIN-Hash Join
  6. OSPF DR选举的先后
  7. 对于XLS碎片提取的深入研究
  8. android 自定义checkBox的样式
  9. android点9图architecture
  10. Service生命周期