主要是继承 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. document.onreadystatechange()来判断页面加载完

    document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function subSomething() {  if(docum ...

  2. 放弃阿里云主机,选择高性价比Vultr VPS免备案

    阿里云主机ECS推广多年后,质量有所改善,但我依然强烈不推荐阿里云主机.考虑性价比带宽速度等因素后,我推荐的vps品牌有vultr和digitalocean,还有大名鼎鼎的linode,是中国用户的最 ...

  3. Openjudge-计算概论(A)-1的个数

    描述: 给定一个十进制整数N,求其对应2进制数中1的个数输入第一个整数表示有N组测试数据,其后N行是对应的测试数据,每行为一个整数.输出N行,每行输出对应一个输入.样例输入 4 2 100 1000 ...

  4. matlab显示图像的横纵坐标

    imshow(I);title('公路');axis on;  %如果不需要,on改为off

  5. grub4dos新手指南-1

    对于多数没有或很少接触过linux的windows用户来说,刚开始使用grub时离不开菜单.也就是说,使用grub前,我们要准备menu.lst文件.先讲一些最为常用的命令help用来显示其它命令的用 ...

  6. 不安装oracle客户端,如何运行sqlplus

    1.软件下载 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html 下载如下三个包: oracle-instantc ...

  7. 2016年7款最流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...

  8. python 字典排序,列表排序详细

    在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...

  9. STM32F207V 进行DS18B20处理

    1.  DS18B20接口很简单,VCC.DQ.GND三个引脚,VCC采用外部供电3.3V,DQ需上拉电阻,当时按照参考资料上外接4.7K的上拉电阻,GPIO设置的OD无上拉,始终读不到ROM中的64 ...

  10. UVa 1395 (最小生成树)

    题目链接:http://vjudge.net/problem/41567/origin 本来想着m^2的复杂度撑不住,对于这种擦着边的复杂度就好慌. 首先对所有的边排个序,然后枚举每个可以构成生成树的 ...