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. POJ1258Agri-Net

    http://poj.org/problem?id=1258 题意 : john当上了镇长,打算给每个农场都连接网络,需要用最小的成本连接其他所有农场,所以要找最少的纤维连在一起,任何两个农场之间的距 ...

  2. Android ActionBar 关于tab的应用 以及 TabListener的方法详解

    actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.a ...

  3. lintcode : 空格替换

    题目: 空格替换 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度. 样例 对于字符串"Mr John S ...

  4. java @param参数注解

    注解,@param是参数的解释.如/***@param s 这里表示对s的文字说明,描述 */ public void aa(String s){}一般java中@表示注解,解释一个方法,类,属性的作 ...

  5. Android 自定义Android带图片和文字的ImageButton

    经过分析,上述按钮效果实际上就是一个布局,一个最简单不过的垂直线性布局,上部分是一个ImageView,下部分是一个TextView,这个布局可点击.可设置监听. 我们首先要编写自己的ImageBut ...

  6. javascript中===与==

    == equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 类型转换规则:Boolean> ...

  7. 20-语言入门-20-Financial Management

    题目地址: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=72    描述Larry graduated this year and fina ...

  8. 详谈 Jquery Ajax 异步处理Json数据.

    啥叫异步,啥叫Ajax.咱不谈啥XMLHTTPRequest.通俗讲异步就是前台页面javascript能调用后台方法.这样就达到了无刷新.所谓的Ajax.这里我们讲二种方法 方法一:(微软有自带Aj ...

  9. gulp.watch监听文件

    Gulp.watch()会返回我们熟知的watcher.我们可以利用watcher来监听额外的事件或者向watch中添加文件. 例如,在执行一系列任务和调用一个函数时,你就可以在返回的watcher中 ...

  10. trackr: An AngularJS app with a Java 8 backend – Part IV 实践篇

    REST API对于前后端或后端与后端之间通讯是一个好的接口,而单页应用Single Page Applications (SPA)非常流行. 我们依然以trackr为案例,这是一个跟踪工作时间 请假 ...