android 垂直 SeekBar 源代码(VerticalSeekBar)[转]
主要是继承 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)[转]的更多相关文章
- Android自定义Seekbar拖动条式样
SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...
- Android 6.0 源代码编译实践
http://www.judymax.com/archives/1087 Android 6.0 源代码编译实践 https://mirrors.tuna.tsinghua.edu.cn/help/A ...
- android之SeekBar控件用法
MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActi ...
- Android使用SeekBar时动态显示进度且随SeekBar一起移动
最近有做一个android项目,里面有使用到在播放视频时可以跳播,同时动态显示播放时间.类似于下图 的效果,我只是抽取其中的一部分做展示,刚接到这个事时也是在网上一通找,最后没找到!而且还碰到有些朋友 ...
- 从零開始学android<SeekBar滑动组件.二十二.>
拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object ↳ an ...
- android学习---SeekBar和RatingBar
SeekBar 拖动条:拖动条和滚动栏类似,当是拖动条能够拖动滑块改变进度 RatingBar 星级评分条:星级评分条与拖动条相似 SeekBar特有的xml属性 android:thumb 指 ...
- Android源代码下载之《Android新闻client源代码》
介绍 Android新闻client源代码,功能上分为:新闻.关注.读报.微博.里面比較有特色的就是读报功能.真正安装报纸的排版进行读报.给人得感觉就像是在读真实的报纸.事实上即使首页的动态云标签很有 ...
- Android的SeekBar和RateBar的使用-android学习之旅(三十二)
SeekBar简介 SeekBar允许用户拖动,进行调节经常用于音量调节等方面. android:thumb设置drawable对象来表示拖动的物体. setOnSeekBarChangeListen ...
- Android manifest 获取源代码
/********************************************************************************* * Android manifes ...
随机推荐
- SQL Server 把当前日期中月份和几号中的0 去掉
select left(convert(varchar(10),getdate(),20),4)+replace(right(convert(varchar(10),getdate(),20),6), ...
- NOIP2002-普及组复赛-第二题-级数求和
题目描述 Description 已知:Sn= 1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1<=k<=15),要求计算出一个 ...
- 手动编译生成apk
转载一篇介绍如何去手动编译生成apk的文章: http://jojol-zhou.iteye.com/blog/729254
- laravel 邮箱改密功能
参考网址: http://laravelacademy.org/post/1290.html
- xxx app 项目问题解决一览
前话:作为人生旅途中的小记录 不同账号玩法限制 解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制 **** ...
- IOS 导出ipa文件方法
1.首先打开项目,Device选项栏选择“Generic iOS Device”.如下图所示: 2.选择屏幕上方的“product”并点击打开,选择“Archive”并点击打开,程序就会自动运行,运行 ...
- javascript 事件响应
1.基本事件 2.点击事件 <html> <head> <script type="text/javascript"> function add ...
- PE结构之重定位表
什么是重定位: 重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你占用,你必须转移到别的地址,这就需要基址重定位.你可能会问,不是说过每个进程都有自己独立的虚拟地址空 ...
- hdu_3067_小t的游戏(脑洞)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3067 题意:中文,不解释 题解:一看就知道是要找规律的题,都是有循环节的,看代码. #include ...
- Git的安装
两种方法: 1.命令行git Git preview是命令行Git的安装包,包名如下: Git-1.9.2-preview20140411.exe 2.UI类型的git 图形化界面的git,避免了枯燥 ...