垂直的SeekBar:VerticalSeekBar
- public class VerticalSeekBar extends AbsSeekBar {
- private Drawable mThumb;
- public interface OnSeekBarChangeListener {
- void onProgressChanged(VerticalSeekBar VerticalSeekBar, int progress, boolean fromUser);
- void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar);
- void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar);
- }
- 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 = mThumb;
- if (thumb != null) {
- setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);
- invalidate();
- }
- if (mOnSeekBarChangeListener != null) {
- mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), isPressed());
- }
- }
- private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
- int available = w - getPaddingLeft() - getPaddingRight();
- 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;
- }
- thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
- }
- @Override
- protected void onDraw(Canvas c) {
- c.rotate(-90);// 反转90度,将水平SeekBar竖起来
- c.translate(-getHeight(), 0);// 将经过旋转后得到的VerticalSeekBar移到正确的位置,注意经旋转后宽高值互换
- super.onDraw(c);
- }
- @Override
- protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(heightMeasureSpec, widthMeasureSpec);
- setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());// 宽高值互换
- }
- @Override
- public void setThumb(Drawable thumb) {
- mThumb = thumb;
- super.setThumb(thumb);
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(h, w, oldw, oldh);// 宽高值互换
- }
- // 与源码完全相同,仅为调用宽高值互换处理的onStartTrackingTouch()方法
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (!isEnabled()) {
- return false;
- }
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- setPressed(true);
- onStartTrackingTouch();
- trackTouchEvent(event);
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- trackTouchEvent(event);
- attemptClaimDrag();
- 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;
- }
- default:
- break;
- }
- return true;
- }
- // 宽高值互换处理
- private void trackTouchEvent(MotionEvent event) {
- final int height = getHeight();
- final int available = height - getPaddingBottom() - getPaddingTop();
- int Y = (int) event.getY();
- float scale;
- float progress = 0;
- if (Y > height - getPaddingBottom()) {
- scale = 0.0f;
- } else if (Y < getPaddingTop()) {
- scale = 1.0f;
- } else {
- scale = (float) (height - getPaddingBottom() - Y) / (float) available;
- }
- final int max = getMax();
- progress = scale * max;
- setProgress((int) progress);
- }
- private void attemptClaimDrag() {
- if (getParent() != null) {
- getParent().requestDisallowInterceptTouchEvent(true);
- }
- }
- }
垂直的SeekBar:VerticalSeekBar的更多相关文章
- 垂直的seekbar
看下效果: 1 package org.qianyukun.core.views; import android.content.Context; import android.graphics.Ca ...
- android 垂直 SeekBar 源代码(VerticalSeekBar)[转]
主要是继承 AbsSeekBar 然后修改下面这些方法 onProgressRefresh() //当进度条数据更新的时候,例如我们拖动滑动条的时候,这个方法被调用 setThumbPos() //这 ...
- 自定义垂直拖动的seekbar进度条
系统自定义的seekbar为横向拖动的样式,需要纵向的时则需要自己定义,网上很多说了重写系统SeekBar中onDraw()的方法,但是我使用的时候不知道为什么拖动条和点偏离了,不在一条直线上,好气. ...
- android 基础控件(EditView、SeekBar等)的属性及使用方法
android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ...
- Android 自定义seekbar中,thumb被覆盖掉一部分问题
(图一) (图二) (图三) 做一个自定义的seekbar,更改其背景图片: <com.android.Progress android:id="@+id/focus_seek ...
- Android SeekBar 和 draw9patch 的使用
今天要使用一个SeekBar控件,其实我觉得Android默认样式已经很不错了,无奈设计不同意,而且SeekBar左右两边也有图片,默认样式和图片也确实不协调,因此这里使用图片自定义SeekBar样式 ...
- 自定义seekbar中,thumb被覆盖掉一部分问题
- [Android学习笔记]SeekBar的使用
一.SeekBar滑动条的使用 xml声明: <SeekBar android:id="@+id/seekbar" android:layout_width="20 ...
- android 打造不同的Seekbar
最近项目需要用到双向的seekbar,网上找了好多野不能达到要求,偶然一次机会看到了大众点评的例子,然后我最他做了优化,并对常用的seekbar做了总结. 向上两张图: 比如双向seekbar pub ...
随机推荐
- c# 改变图片的大小(w,h)
本文介绍获取网络上的图片将其大小尺寸改成自己想要的 /// <summary> /// 图片大小裁剪 /// </summary> /// <param name=&qu ...
- wordPress Development
site:http://codex.wordpress.org/Theme_Development 2014-03-24 This article is about developing WordPr ...
- Ubuntu 14.04.2 x64 安装tomcat服务器傻瓜教程
序:安装tomcat服务器之前有一堆的准备工作,比如JDK安装. 一.JDK 7 下载及安装 1.下载JDK文件 X86 代表i386,i486系列, 是为32位操作系统所使用的包.X64是64位操作 ...
- HNU 12827 NASSA’s Robot
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12827&courseid=268 #include&l ...
- error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”
error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- sed替换字符串时,使用正则表达式的注意事项
sed的使用方法为: 使用单个模式替换:sed 's/pattern/replacement/flags' filename,例如echo 'abc' | sed 's/a/A/'-->Abc ...
- 动态设置Div坐标
<style type="text/css"> #main{text-align:center; background-color:#9FF; height:600px ...
- 设置windows网络连接别名和linux网络连接别名
windows网络连接别名 C:\Windows\System32\drivers\etc目录下的hosts文件中添加 127.0.0.1 localhost 192.168.1.100 proxy. ...
- 解决kettle配置文件中的中文乱码
在日常开发中有时候配置文件会出现中文(如config.properties 里有中文),为了避免出现乱码,因而要转成unicode编码. 1.在设置变量的javascript(转换中的JavaScri ...