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. POJ 1699 Best Sequence(DFS)

    題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做 ...

  2. hdu 1063 Exponentiation

    求实数的幂,这个用C++写的话有点长,但是用Java写就非常方便了…… );            System.out.println(an);        }    }}

  3. hdu1020 Encoding

    http://acm.hdu.edu.cn/showproblem.php?pid=1020 过了的就是好孩子........ #include<stdio.h> #include< ...

  4. JS操作Radio与Select

    //radio的chang事件,以及获取选中的radio的值 $("input[name=radioName]").on("change", function( ...

  5. 【mongoDB中级篇②】索引与expain

    索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...

  6. 什么是spring?

    一.对spring的理解. 1.Spring是实现了工厂模式的工厂类(什么是工厂类?简单的来说就是把需要的接口定义到一个类中,需要的时候不用新建,直接从这个类中调用该接口就可以了), 这个类的名字为B ...

  7. Java学习笔记之:Java数组

    一.介绍 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如number ...

  8. Java API ——Collection集合类 & Iterator接口

    对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...

  9. JNIEnv解析

    1.关于JNIEnv和JavaVM JNIEnv:线程相关的变量 JavaVM:是虚拟机在JNI层的代表, JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在J ...

  10. Lists of network protocols

    https://en.wikipedia.org/wiki/Lists_of_network_protocols Protocol stack: List of network protocol st ...