垂直的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 ...
随机推荐
- IHttpModule在webconfig中的注册
在asp.net中,提供了两种方式用来解决获取由asp.net服务器创建和维护的HttpApplication对象,方便注册HttpApplication对象的事件处理.这两种方式为:IHtpModu ...
- SMTP 简单邮件传输协议
SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...
- ExtJS学习之路第七步:contentEl与renderTo的区别
上回在Panel的应用中我们应该能大致区分开conteEl和renderTo,这回我们从定义中区分. 在Panel的API中, contentEl:String指定一个现有的HTML元素或者id作为此 ...
- cocos基础教程(4)基础概念介绍
在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...
- RecContentType有哪些
HTML 页面text/javascript `type="text/javascript"` 是比较老的写法IETF 推荐的是 `type="application ...
- ZeroMQ之Request/Response (Java)
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
- poj2253 最短路 floyd Frogger
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28825 Accepted: 9359 Descript ...
- ZJOI Day 2 游记
---恢复内容开始--- 去ZJOI Day 2打了一会酱油...各种神犇大爷都来屠,南外的小朋友也来屠我们了真是感动...没有看到毛爷爷真是可惜.. Day[-1] 早上还在上课,吃完中饭立马跑去找 ...
- Solr DIH导入出现 Data Config problem: 前言中不允许有内容 异常
Solr配置DIH导入时出现 “Data Config problem: 前言中不允许有内容.” 异常. <response> <lst name="responseHea ...
- Python网络编程(4)——异步编程select & epoll
在SocketServer模块的学习中,我们了解了多线程和多进程简单Server的实现,使用多线程.多进程技术的服务端为每一个新的client连接创建一个新的进/线程,当client数量较多时,这种技 ...