主要是继承 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

android 垂直 SeekBar 源代码(VerticalSeekBar)[转]的更多相关文章

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

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

  2. Android 6.0 源代码编译实践

    http://www.judymax.com/archives/1087 Android 6.0 源代码编译实践 https://mirrors.tuna.tsinghua.edu.cn/help/A ...

  3. android之SeekBar控件用法

    MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActi ...

  4. Android使用SeekBar时动态显示进度且随SeekBar一起移动

    最近有做一个android项目,里面有使用到在播放视频时可以跳播,同时动态显示播放时间.类似于下图 的效果,我只是抽取其中的一部分做展示,刚接到这个事时也是在网上一通找,最后没找到!而且还碰到有些朋友 ...

  5. 从零開始学android&lt;SeekBar滑动组件.二十二.&gt;

    拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object    ↳ an ...

  6. android学习---SeekBar和RatingBar

    SeekBar 拖动条:拖动条和滚动栏类似,当是拖动条能够拖动滑块改变进度 RatingBar 星级评分条:星级评分条与拖动条相似 SeekBar特有的xml属性 android:thumb    指 ...

  7. Android源代码下载之《Android新闻client源代码》

    介绍 Android新闻client源代码,功能上分为:新闻.关注.读报.微博.里面比較有特色的就是读报功能.真正安装报纸的排版进行读报.给人得感觉就像是在读真实的报纸.事实上即使首页的动态云标签很有 ...

  8. Android的SeekBar和RateBar的使用-android学习之旅(三十二)

    SeekBar简介 SeekBar允许用户拖动,进行调节经常用于音量调节等方面. android:thumb设置drawable对象来表示拖动的物体. setOnSeekBarChangeListen ...

  9. Android manifest 获取源代码

    /********************************************************************************* * Android manifes ...

随机推荐

  1. erlang 常用的计算长度函数

    1.size 可以计算元祖长度和标准binary长度 2.tuple_size 计算元祖长度 3.length 计算列表长度 4.byte_size 计算标准和非标准binary的长度 非标准 < ...

  2. 【codevs】1860 最大数

    1860 最大数     题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 输入描述 Input Description 第一行一个正整数n. ...

  3. 关于oracle数据库(5)增删改查

    添加.修改.删除.查询都叫SQL语言(结构化查询语言) 添加数据(注意事项:列的顺序和值的顺序要相同.数量也要相同:字符串要加单引号,数字可以加或不加) insert into 表名(列名,列名,列名 ...

  4. json处理三部曲之第三曲:利用Gson处理json

    需要导入gson-xxx.jar包 <dependency> <groupId>com.google.code.gson</groupId> <artifac ...

  5. json处理三部曲之第二曲:利用Jackson处理json

    利用Jackson处理json需要导入的jar包(2以上版本的): <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.c ...

  6. windows下如何快速搭建web.py开发框架

    在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方 ...

  7. 使用node.js创建第一个应用

    node.js应用组成部分 1.引入require模块:我们可以使用require指令来载入Node.js模块. 2.创建服务器:服务器可以监听客户端的请求,类似于Apache,Nninx等HTTP服 ...

  8. Linux 压缩解压命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...

  9. 多选出差同事id,拼接,去掉最后逗号

    ===========方法1 substr() ,永远都是.(第一个参数)开始位置.(第二个参数)截取个数 ,负数表示都后面开始数 substr($data['members'],0,strlen($ ...

  10. text-size-adjust的值为100% 代替值 none

    iPhone 横屏默认会放大文字,设置text-size-adjust会解决这个问题 一般用text-size-adjust:none 但建议用100%代替none text-size-adjust: ...