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. Ubuntu环境下Hadoop1.2.1, HBase0.94.25, nutch2.2.1各个配置文件一览

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  2. Ubuntu环境下手动配置HBase0.94.25

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  3. hdu 2837 Calculation

    公式:a^b%p=a^(b%phi(p)+phi(p))%p   b>=phi(p) #include<iostream> #include<stdio.h> #incl ...

  4. hdu 3123 GCC

    这题分2种情况: 1) n>=m时,k!%m=0(k>=m),所以只需令n=m-1即可: 2) n<m时,正常情况处理即可. ;}

  5. switch… case 语句的用法

    switch… case 语句的用法   public class Test7 { public static void main(String[] args) { int i=5; switch(i ...

  6. C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且 ...

  7. 使用WM_COPYDATA跨进程发送数据

    进程之间通讯的几种方法: 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有 使用内存映射文件 通过共享内存DLL共享内存 使用SendMessage向另一进程发送WM_ ...

  8. 利用PhantomJS搭建Highcharts export服务

    利用PhantomJS搭建Highcharts export服务 一直在使用Highcharts做web图表的展示, 但是当发送定时的报表邮件的遇到了这个问题. 为了保证邮件图表和web页图表样式一致 ...

  9. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  10. UVa 10075 - Airlines

    航线算球面距离,需要经纬度转空间坐标. 任意两点间距离用Floyd求出来,查询时直接查表. #include <cstdio> #include <map> #include ...