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
转载于:https://www.cnblogs.com/yihujiu/p/5760047.html
android 垂直 SeekBar 源代码(VerticalSeekBar)[转]相关推荐
- Android自定义垂直 SeekBar
概述 android 本身只有一个水平的 seekbar,开发需要使用垂直的seekbar就只能自己实现了,好在可以直接继承水平seekbar,修改几个重载事件即可 忘了放图了,补上 默认水平Seek ...
- Android自定义Seekbar拖动条式样
SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...
- android-verticalseekbar——Android可视化SeekBar类库
android-verticalseekbar--Android可视化SeekBar类库 转载于:https://www.cnblogs.com/zhujiabin/p/5706246.html
- Android使用SeekBar
转自:http://my.oschina.net/pingdy/blog/376735 最近有做一个android项目,里面有使用到在播放视频时可以跳播,同时动态显示播放时间.类似于下图 的效果,我只 ...
- android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题
开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...
- Android manifest 获取源代码
/********************************************************************************** Android manifest ...
- android studio seekbar 简单音乐播放器
我这个seekbar比较简单,是访问自己放进raw文件里的音乐文件:通过Mediapaly实现后台播放. 用if语句判断图片实现切换歌曲,seekbar可以拖动歌曲进度,用 Duration=mp4. ...
- android 远程视频监控程序源码,详解基于Android已开放源代码的远程视频监控系统教程...
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.Socket的英文原义是"孔"或"插座".通常也称作"套接字 ...
- Android按钮滚动条,Android自定义Seekbar滑动条,Pop提示跟随滑动按钮一起滑动
由于项目需要做出此效果,自定义写了一个. 效果图 思路: 原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件. 代码: 在values文件夹下新建attr ...
最新文章
- 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...
- struts2学习笔记(二):Struts2配置
- MySQL 全文索引实现简单版搜索引擎
- 作者:刘强强(1992-),男,贵州大学公共管理学院硕士生。
- python获取绝对路径的区别_python 获取路径不同方法的比较
- 语音识别(3)---语音识别技术原理
- Net需要掌握的知识
- apache php 分离mysql_Apache、php、mysql单独安装配置
- 英国野生生物摄影奖之一个地球奖
- 步进电机驱动技术3:基于ULN2003的步进电机驱动
- The CATALINA_HOME environment variable is not defined correctly
- Android 短视频SDK
- 【XAI】Comment: Graphical Models, Causality and Intervention
- 如何找回Nessus密码?
- 同一个用户异地登陆踢人操作
- java配置环境变量path(JAVA配置环境变量失败)
- FE_CSS 页面布局之定位
- 多线程并发下集合不安全类-ArrayList
- vue3(vite)设置代理,封装axios,api解耦
- 中国传媒大学博士申请初试准备经验(文科+工科)(2022)