NumberSeekBar 可任意拖动和自动
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 可任意拖动和自动的更多相关文章
- H5拖动火狐自动打开新标签
写在前面的话:<H5拖动火狐自动打开新标签>原因是为什么百度很多了我就不细说,本文章只说我自己的解决方法... 自定义数据里写个链接,如果火狐自动打开就跳到这个链接 这个页面就写一句话:关 ...
- JavaScript中,让一个div在固定的父div中任意拖动
1.css代码 #big { border: 1px solid #FF3300; width: 300px; height: 300px; position: relative; } #small ...
- duilib 实现列表头任意拖动
1.表头(xml) <List name="List_records" padding="5,10,5,5" bkcolor="#FFFFFFF ...
- 让div在body中任意拖动
HTML代码 <div id="idOuterDiv" class="CsOuterDiv"> </div> CSS代码 body { ...
- EUI 自动滚动的聊天文本
一 自动滚动的聊天文本 当文本输入改变时,将scrollV值等于maxScrollV值. private scrollLabel:eui.Label; egret.Tween.).call(()=&g ...
- android实现可拖动按钮
功能:在Android中实现可拖动按钮,同时实现按钮的点击功能 相关问题: 按钮拖动的界限限定. 按钮单击和拖动之间的冲突. 在界面未显示之前,获得View的高/宽. 问题描述: 如果不为按钮的拖动范 ...
- Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件
本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框. Eclipse代码自动补全功能默认只包括 点"." ,即只有输入”." ...
- Eclipse使用技巧 - 2. Eclipse自动补全功能轻松设置
本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框. Eclipse代码自动补全功能默认只包括 点”.” ,即只有输入”.”后才出现自动补全的提示框.想要自动补 ...
- WinForm版图像编辑小程序(实现图像拖动、缩放、旋转、抠图)
闲暇之余,开发一个图片编辑小程序.程序主要特点就是可方便的对多个图像编辑,实现了一些基本的操作.本文主要介绍一下程序的功能.设计思路. 执行程序 下载地址: 百度网盘.https://pan.baid ...
随机推荐
- sql中时间的比较方法
--------------------------------------------------------------------1. 当前系统日期.时间select getdate() 2. ...
- jQuery对象与Dom对象的相互转换
1.jQuery对象转换为Dom对象 [index] var $d = $("#id"); ]; get(index) var $d = $("#id"); ) ...
- JavaEE5种常见的设计模式
1.工厂模式:比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等, 那么连接数据库的代码是不一样的,你用传统的方 ...
- C 语言学习guideline
Kernighan和Ritchie的<The C Programming Language>(中译名<C程序设计语言>)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标 ...
- nginx的健康检查功能将挂掉的Tomcat舍弃
1.Ngninx自带健康检查功能,能将挂掉的服务器舍弃,不在访问路径里 2.Nginx还有URL重写功能,能将接收到的请求,进行改写,再将新的URL分发到后端服务器上
- 使用PowerDesigner进行数据库建模入门
阅读目录 两种重要模型 创建表和主外键 创建视图和存储过程 生成数据库 PowerDesigner(简称PD)是一种强大的数据库建模工具,使用PD可以创建业务模型,UML类图等,当然最主要的功能是数据 ...
- SQL查询(笔记2——实体查询)
SQL查询(笔记2——实体查询) 二.实体查询 如果查询返回了某个数据表的全部数据列,且该数据表有对应的持久化类映射,我们就把查询结果转换成实体查询.将查询结果转换成实体,可以使用SQLQuery提供 ...
- 1、Singleton 单件(创建模式)
一.Singleton模式主要应用在一些特殊的类,在整个系统运行中,有且仅有一个实例的场景 二.Singleton模式分为单线程与多线程情况,当然多线程一样适应单线程 单线程:在这种情况下比较容易,因 ...
- HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)
Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players tak ...
- Servlet的response输出到页面时乱码的解决方法
package com.mhb; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servle ...