package com.example.numberseekbar;

 import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar; /**
* @类名: NumberSeekBar
* @描述: TODO(带有数字的水平拖动条)
*/
public class NumberSeekBar extends SeekBar { private int oldPaddingTop; private int oldPaddingLeft; private int oldPaddingRight; private int oldPaddingBottom; private boolean isMysetPadding = true; private String mText; private float mTextWidth; private float mImgWidth; private float mImgHei; private Paint mPaint; private Resources res; private Bitmap bm; private int textsize = 13; private int textpaddingleft; private int textpaddingtop; private int imagepaddingleft; private int imagepaddingtop; public NumberSeekBar(Context context) {
super(context);
init();
} public NumberSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public NumberSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} // 屏蔽滑动
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// return false;
// }
/**
* (非 Javadoc)
*
* @方法名: onTouchEvent
* @描述: 不屏蔽屏蔽滑动
* @日期: 2014-8-11 下午2:03:15
* @param event
* @return
* @see android.widget.AbsSeekBar#onTouchEvent(android.view.MotionEvent)
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
} // 修改setpadding 使其在外部调用的时候无效
@Override
public void setPadding(int left, int top, int right, int bottom) {
if (isMysetPadding) {
super.setPadding(left, top, right, bottom);
}
} // 初始化
private void init() {
res = getResources();
initBitmap();
initDraw();
setPadding();
} private void initDraw() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setTypeface(Typeface.DEFAULT);
mPaint.setTextSize(textsize);
mPaint.setColor(0xff23fc4f);
} private void initBitmap() {
bm = BitmapFactory.decodeResource(res, R.drawable.popwindow_bg1);
if (bm != null) {
mImgWidth = bm.getWidth();
mImgHei = bm.getHeight();
} else {
mImgWidth = 0;
mImgHei = 0;
}
} protected synchronized void onDraw(Canvas canvas) {
try {
super.onDraw(canvas);
mText = (getProgress() * 100 / getMax()) + "%";
mTextWidth = mPaint.measureText(mText);
Rect bounds = this.getProgressDrawable().getBounds();
float xImg = bounds.width() * getProgress() / getMax()
+ imagepaddingleft + oldPaddingLeft;
float yImg = imagepaddingtop + oldPaddingTop;
float xText = bounds.width() * getProgress() / getMax() + mImgWidth
/ 2 - mTextWidth / 2 + textpaddingleft + oldPaddingLeft;
float yText = yImg + textpaddingtop + mImgHei / 2 + getTextHei()
/ 4;
canvas.drawBitmap(bm, xImg, yImg, mPaint);
canvas.drawText(mText, xText, yText, mPaint);
} catch (Exception e) {
e.printStackTrace();
}
} // 初始化padding 使其左右上 留下位置用于展示进度图片
private void setPadding() {
int top = getBitmapHeigh() + oldPaddingTop;
int left = getBitmapWidth() / 2 + oldPaddingLeft;
int right = getBitmapWidth() / 2 + oldPaddingRight;
int bottom = oldPaddingBottom;
isMysetPadding = true;
setPadding(left, top, right, bottom);
isMysetPadding = false;
} /**
* 设置展示进度背景图片
*
* @param resid
*/
public void setBitmap(int resid) {
bm = BitmapFactory.decodeResource(res, resid);
if (bm != null) {
mImgWidth = bm.getWidth();
mImgHei = bm.getHeight();
} else {
mImgWidth = 0;
mImgHei = 0;
}
setPadding();
} /**
* 替代setpadding
*
* @param left
* @param top
* @param right
* @param bottom
*/
public void setMyPadding(int left, int top, int right, int bottom) {
oldPaddingTop = top;
oldPaddingLeft = left;
oldPaddingRight = right;
oldPaddingBottom = bottom;
isMysetPadding = true;
setPadding(left + getBitmapWidth() / 2, top + getBitmapHeigh(), right
+ getBitmapWidth() / 2, bottom);
isMysetPadding = false;
} /**
* 设置进度字体大小
*
* @param textsize
*/
public void setTextSize(int textsize) {
this.textsize = textsize;
mPaint.setTextSize(textsize);
} /**
* 设置进度字体颜色
*
* @param color
*/
public void setTextColor(int color) {
mPaint.setColor(color);
} /**
* 调整进度字体的位置 初始位置为图片的正中央
*
* @param top
* @param left
*/
public void setTextPadding(int top, int left) {
this.textpaddingleft = left;
this.textpaddingtop = top;
} /**
* 调整进图背景图的位置 初始位置为进度条正上方、偏左一半
*
* @param top
* @param left
*/
public void setImagePadding(int top, int left) {
this.imagepaddingleft = left;
this.imagepaddingtop = top;
} private int getBitmapWidth() {
return (int) Math.ceil(mImgWidth);
} private int getBitmapHeigh() {
return (int) Math.ceil(mImgHei);
} private float getTextHei() {
FontMetrics fm = mPaint.getFontMetrics();
return (float) Math.ceil(fm.descent - fm.top) + 2;
} public int getTextpaddingleft() {
return textpaddingleft;
} public int getTextpaddingtop() {
return textpaddingtop;
} public int getImagepaddingleft() {
return imagepaddingleft;
} public int getImagepaddingtop() {
return imagepaddingtop;
} public int getTextsize() {
return textsize;
} }
 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <com.example.numberseekbar.NumberSeekBar
android:id="@+id/bar0"
style="@style/NumberProgressBar_Default"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:max="100"
android:progressDrawable="@drawable/numberseekbar_background"
android:thumb="@drawable/thumb_bar" />
<!-- padding设置无效需要在代码中设置 --> <com.example.numberseekbar.NumberSeekBar
android:id="@+id/bar1"
style="@style/NumberProgressBar_Default"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:max="200"
android:progressDrawable="@drawable/numberseekbar_background"
android:thumb="@drawable/thumb_bar" /> <com.example.numberseekbar.NumberSeekBar
android:id="@+id/bar2"
style="@style/NumberProgressBar_Default"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:max="300"
android:progressDrawable="@drawable/numberseekbar_background"
android:thumb="@drawable/thumb_bar" /> </LinearLayout>

style="@style/NumberProgressBar_Default"

 <!-- NumberProgressBar进度条相关style -->
<style name="NumberProgressBar_Default">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">match_parent</item>
<item name="max">100</item>
<item name="progress">0</item>
<item name="progress_unreached_color">#CCCCCC</item>
<item name="progress_reached_color">#3498DB</item>
<item name="progress_text_size">10sp</item>
<item name="progress_text_color">#3498DB</item>
<item name="progress_reached_bar_height">1.5dp</item>
<item name="progress_unreached_bar_height">0.75dp</item>
</style>

android:progressDrawable="@drawable/numberseekbar_background"         res\drawable\numberseekbar_background.xml

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 背景图 -->
<item
android:id="@+android:id/background"
android:drawable="@drawable/bar_dn"/>
<!-- 第二进度图 -->
<item
android:id="@+id/SecondaryProgress"
android:drawable="@drawable/bar_up"/>
<!-- 进度度 -->
<item
android:id="@+android:id/progress"
android:drawable="@drawable/bar_dn"/> </layer-list>

android:thumb="@drawable/thumb_bar"             res\drawable\thumb_bar.xml

 <?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按下状态 -->
<item android:drawable="@drawable/thumb_dn" android:state_pressed="true"/> <!-- 焦点状态 -->
<item android:drawable="@drawable/thumb_up" android:state_focused="true"/> <!-- 默认状态 -->
<item android:drawable="@drawable/thumb_up"/> </selector>
 package com.example.numberseekbar;

 import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message; public class MainActivity extends Activity {
private NumberSeekBar pb, pb1, pb2; @SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
pb.setProgress(pb.getProgress() + 5);
pb1.setProgress(pb1.getProgress() + 5);
pb2.setProgress(pb2.getProgress() + 10);
break;
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_numberseekbar);
pb = (NumberSeekBar) findViewById(R.id.bar0);
pb1 = (NumberSeekBar) findViewById(R.id.bar1);
pb2 = (NumberSeekBar) findViewById(R.id.bar2);
init();
start();
} private void init() {
pb.setTextSize(20);// 设置字体大小
pb.setTextColor(Color.WHITE);// 颜色
pb.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效
pb.setImagePadding(0, 1);// 可以不设置
pb.setTextPadding(0, 0);// 可以不设置 pb1.setTextSize(20);// 设置字体大小
pb1.setTextColor(Color.WHITE);// 颜色
pb1.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效
pb1.setImagePadding(0, 1);// 可以不设置
pb1.setTextPadding(0, 0);// 可以不设置 pb2.setTextSize(20);// 设置字体大小
pb2.setTextColor(Color.WHITE);// 颜色
pb2.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效
pb2.setImagePadding(0, 1);// 可以不设置
pb2.setTextPadding(0, 0);// 可以不设置
} private void start() {
TimerTask tt = new TimerTask() {
public void run() {
handler.sendEmptyMessage(1);
}
};
Timer timer = new Timer();
timer.schedule(tt, 1000, 2000);
} }

     bar_dn.png

     bar_up.png

               popwindow_bg1.PNG

                        thumb_dn.png

                       thumb_up.png

NumberSeekBar 可任意拖动和自动的更多相关文章

  1. H5拖动火狐自动打开新标签

    写在前面的话:<H5拖动火狐自动打开新标签>原因是为什么百度很多了我就不细说,本文章只说我自己的解决方法... 自定义数据里写个链接,如果火狐自动打开就跳到这个链接 这个页面就写一句话:关 ...

  2. JavaScript中,让一个div在固定的父div中任意拖动

    1.css代码 #big { border: 1px solid #FF3300; width: 300px; height: 300px; position: relative; } #small ...

  3. duilib 实现列表头任意拖动

    1.表头(xml) <List name="List_records" padding="5,10,5,5" bkcolor="#FFFFFFF ...

  4. 让div在body中任意拖动

    HTML代码 <div id="idOuterDiv" class="CsOuterDiv"> </div> CSS代码 body { ...

  5. EUI 自动滚动的聊天文本

    一 自动滚动的聊天文本 当文本输入改变时,将scrollV值等于maxScrollV值. private scrollLabel:eui.Label; egret.Tween.).call(()=&g ...

  6. android实现可拖动按钮

    功能:在Android中实现可拖动按钮,同时实现按钮的点击功能 相关问题: 按钮拖动的界限限定. 按钮单击和拖动之间的冲突. 在界面未显示之前,获得View的高/宽. 问题描述: 如果不为按钮的拖动范 ...

  7. Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件

    本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框.   Eclipse代码自动补全功能默认只包括 点"."  ,即只有输入”." ...

  8. Eclipse使用技巧 - 2. Eclipse自动补全功能轻松设置

    本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框. Eclipse代码自动补全功能默认只包括 点”.” ,即只有输入”.”后才出现自动补全的提示框.想要自动补 ...

  9. WinForm版图像编辑小程序(实现图像拖动、缩放、旋转、抠图)

    闲暇之余,开发一个图片编辑小程序.程序主要特点就是可方便的对多个图像编辑,实现了一些基本的操作.本文主要介绍一下程序的功能.设计思路. 执行程序 下载地址: 百度网盘.https://pan.baid ...

随机推荐

  1. hadoop倒排索引

    1.前言 学习hadoop的童鞋,倒排索引这个算法还是挺重要的.这是以后展开工作的基础.首先,我们来认识下什么是倒拍索引: 倒排索引简单地就是:根据单词,返回它在哪个文件中出现过,而且频率是多少的结果 ...

  2. **使用 Git Hook 实现网站的自动部署

    http://www.tuicool.com/articles/3QRB7jU 自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自 ...

  3. linux网站推荐

    推荐几个Liux中文学些网站. http://www.chinaunix.net/http://linux.cn/http://www.linuxidc.com/

  4. FastDFS_v5.05安装配置

    废话不多讲,启动FastDFS文件服务器的命令是 #/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf #/usr/bin/fdfs_storaged /etc ...

  5. *IDEA真好用

    使用maven做开发,在编辑pom.xml文件时

  6. 基于Struts2框架实现登录案例 之 程序国际化

    国际化牵涉的知识非常多,这里只能简单的介绍,程序国际化的一般做法是:在jsp页面时, 不是直接输出信息,而是输出一个key值,该key值在不同语言环境下找到对应资源文件下的 对应信息,因此首先要创建满 ...

  7. float与double的范围和精度

    1. 范围   float和double的范围是由指数的位数来决定的.  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位 ...

  8. Java中ArrayList和LinkedList区别

    ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...

  9. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  10. IOS刷新数据

    在一个项目开发过程中为了更好的体验经常会用到下拉刷新更新数据,当然也伴随一些上拉加载更多数据的情况:当前比较火的EGOTableViewPullRefresh只实现了下拉功能,而没有上拉的功能.这里介 ...