1 package com.example.numberseekbar; 2 3 import android.content.Context; 4 import android.content.res.Resources; 5 import android.graphics.Bitmap; 6 import android.graphics.BitmapFactory; 7 import android.graphics.Canvas; 8 import android.graphics.Paint; 9 import android.graphics.Paint.FontMetrics; 10 import android.graphics.Rect; 11 import android.graphics.Typeface; 12 import android.util.AttributeSet; 13 import android.view.MotionEvent; 14 import android.widget.SeekBar; 15 16 /** 17 * @类名: NumberSeekBar 18 * @描述: TODO(带有数字的水平拖动条) 19 */ 20 public class NumberSeekBar extends SeekBar { 21 22 private int oldPaddingTop; 23 24 private int oldPaddingLeft; 25 26 private int oldPaddingRight; 27 28 private int oldPaddingBottom; 29 30 private boolean isMysetPadding = true; 31 32 private String mText; 33 34 private float mTextWidth; 35 36 private float mImgWidth; 37 38 private float mImgHei; 39 40 private Paint mPaint; 41 42 private Resources res; 43 44 private Bitmap bm; 45 46 private int textsize = 13; 47 48 private int textpaddingleft; 49 50 private int textpaddingtop; 51 52 private int imagepaddingleft; 53 54 private int imagepaddingtop; 55 56 public NumberSeekBar(Context context) { 57 super(context); 58 init(); 59 } 60 61 public NumberSeekBar(Context context, AttributeSet attrs) { 62 super(context, attrs); 63 init(); 64 } 65 66 public NumberSeekBar(Context context, AttributeSet attrs, int defStyle) { 67 super(context, attrs, defStyle); 68 init(); 69 } 70 71 // 屏蔽滑动 72 // @Override 73 // public boolean onTouchEvent(MotionEvent event) { 74 // return false; 75 // } 76 /** 77 * (非 Javadoc) 78 * 79 * @方法名: onTouchEvent 80 * @描述: 不屏蔽屏蔽滑动 81 * @日期: 2014-8-11 下午2:03:15 82 * @param event 83 * @return 84 * @see android.widget.AbsSeekBar#onTouchEvent(android.view.MotionEvent) 85 */ 86 @Override 87 public boolean onTouchEvent(MotionEvent event) { 88 return super.onTouchEvent(event); 89 } 90 91 // 修改setpadding 使其在外部调用的时候无效 92 @Override 93 public void setPadding(int left, int top, int right, int bottom) { 94 if (isMysetPadding) { 95 super.setPadding(left, top, right, bottom); 96 } 97 } 98 99 // 初始化 100 private void init() { 101 res = getResources(); 102 initBitmap(); 103 initDraw(); 104 setPadding(); 105 } 106 107 private void initDraw() { 108 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 109 mPaint.setTypeface(Typeface.DEFAULT); 110 mPaint.setTextSize(textsize); 111 mPaint.setColor(0xff23fc4f); 112 } 113 114 private void initBitmap() { 115 bm = BitmapFactory.decodeResource(res, R.drawable.popwindow_bg1); 116 if (bm != null) { 117 mImgWidth = bm.getWidth(); 118 mImgHei = bm.getHeight(); 119 } else { 120 mImgWidth = 0; 121 mImgHei = 0; 122 } 123 } 124 125 protected synchronized void onDraw(Canvas canvas) { 126 try { 127 super.onDraw(canvas); 128 mText = (getProgress() * 100 / getMax()) + "%"; 129 mTextWidth = mPaint.measureText(mText); 130 Rect bounds = this.getProgressDrawable().getBounds(); 131 float xImg = bounds.width() * getProgress() / getMax() 132 + imagepaddingleft + oldPaddingLeft; 133 float yImg = imagepaddingtop + oldPaddingTop; 134 float xText = bounds.width() * getProgress() / getMax() + mImgWidth 135 / 2 - mTextWidth / 2 + textpaddingleft + oldPaddingLeft; 136 float yText = yImg + textpaddingtop + mImgHei / 2 + getTextHei() 137 / 4; 138 canvas.drawBitmap(bm, xImg, yImg, mPaint); 139 canvas.drawText(mText, xText, yText, mPaint); 140 } catch (Exception e) { 141 e.printStackTrace(); 142 } 143 } 144 145 // 初始化padding 使其左右上 留下位置用于展示进度图片 146 private void setPadding() { 147 int top = getBitmapHeigh() + oldPaddingTop; 148 int left = getBitmapWidth() / 2 + oldPaddingLeft; 149 int right = getBitmapWidth() / 2 + oldPaddingRight; 150 int bottom = oldPaddingBottom; 151 isMysetPadding = true; 152 setPadding(left, top, right, bottom); 153 isMysetPadding = false; 154 } 155 156 /** 157 * 设置展示进度背景图片 158 * 159 * @param resid 160 */ 161 public void setBitmap(int resid) { 162 bm = BitmapFactory.decodeResource(res, resid); 163 if (bm != null) { 164 mImgWidth = bm.getWidth(); 165 mImgHei = bm.getHeight(); 166 } else { 167 mImgWidth = 0; 168 mImgHei = 0; 169 } 170 setPadding(); 171 } 172 173 /** 174 * 替代setpadding 175 * 176 * @param left 177 * @param top 178 * @param right 179 * @param bottom 180 */ 181 public void setMyPadding(int left, int top, int right, int bottom) { 182 oldPaddingTop = top; 183 oldPaddingLeft = left; 184 oldPaddingRight = right; 185 oldPaddingBottom = bottom; 186 isMysetPadding = true; 187 setPadding(left + getBitmapWidth() / 2, top + getBitmapHeigh(), right 188 + getBitmapWidth() / 2, bottom); 189 isMysetPadding = false; 190 } 191 192 /** 193 * 设置进度字体大小 194 * 195 * @param textsize 196 */ 197 public void setTextSize(int textsize) { 198 this.textsize = textsize; 199 mPaint.setTextSize(textsize); 200 } 201 202 /** 203 * 设置进度字体颜色 204 * 205 * @param color 206 */ 207 public void setTextColor(int color) { 208 mPaint.setColor(color); 209 } 210 211 /** 212 * 调整进度字体的位置 初始位置为图片的正中央 213 * 214 * @param top 215 * @param left 216 */ 217 public void setTextPadding(int top, int left) { 218 this.textpaddingleft = left; 219 this.textpaddingtop = top; 220 } 221 222 /** 223 * 调整进图背景图的位置 初始位置为进度条正上方、偏左一半 224 * 225 * @param top 226 * @param left 227 */ 228 public void setImagePadding(int top, int left) { 229 this.imagepaddingleft = left; 230 this.imagepaddingtop = top; 231 } 232 233 private int getBitmapWidth() { 234 return (int) Math.ceil(mImgWidth); 235 } 236 237 private int getBitmapHeigh() { 238 return (int) Math.ceil(mImgHei); 239 } 240 241 private float getTextHei() { 242 FontMetrics fm = mPaint.getFontMetrics(); 243 return (float) Math.ceil(fm.descent - fm.top) + 2; 244 } 245 246 public int getTextpaddingleft() { 247 return textpaddingleft; 248 } 249 250 public int getTextpaddingtop() { 251 return textpaddingtop; 252 } 253 254 public int getImagepaddingleft() { 255 return imagepaddingleft; 256 } 257 258 public int getImagepaddingtop() { 259 return imagepaddingtop; 260 } 261 262 public int getTextsize() { 263 return textsize; 264 } 265 266 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <com.example.numberseekbar.NumberSeekBar 8 android:id="@+id/bar0" 9 style="@style/NumberProgressBar_Default" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" 12 android:focusable="false" 13 android:max="100" 14 android:progressDrawable="@drawable/numberseekbar_background" 15 android:thumb="@drawable/thumb_bar" /> 16 <!-- padding设置无效需要在代码中设置 --> 17 18 <com.example.numberseekbar.NumberSeekBar 19 android:id="@+id/bar1" 20 style="@style/NumberProgressBar_Default" 21 android:layout_width="fill_parent" 22 android:layout_height="wrap_content" 23 android:focusable="false" 24 android:max="200" 25 android:progressDrawable="@drawable/numberseekbar_background" 26 android:thumb="@drawable/thumb_bar" /> 27 28 <com.example.numberseekbar.NumberSeekBar 29 android:id="@+id/bar2" 30 style="@style/NumberProgressBar_Default" 31 android:layout_width="fill_parent" 32 android:layout_height="wrap_content" 33 android:focusable="false" 34 android:max="300" 35 android:progressDrawable="@drawable/numberseekbar_background" 36 android:thumb="@drawable/thumb_bar" /> 37 38 </LinearLayout>
style="@style/NumberProgressBar_Default"
1 <!-- NumberProgressBar进度条相关style --> 2 <style name="NumberProgressBar_Default"> 3 <item name="android:layout_height">wrap_content</item> 4 <item name="android:layout_width">match_parent</item> 5 <item name="max">100</item> 6 <item name="progress">0</item> 7 <item name="progress_unreached_color">#CCCCCC</item> 8 <item name="progress_reached_color">#3498DB</item> 9 <item name="progress_text_size">10sp</item> 10 <item name="progress_text_color">#3498DB</item> 11 <item name="progress_reached_bar_height">1.5dp</item> 12 <item name="progress_unreached_bar_height">0.75dp</item> 13 </style>
android:progressDrawable="@drawable/numberseekbar_background" res\drawable\numberseekbar_background.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 3 4 <!-- 背景图 --> 5 <item 6 android:id="@+android:id/background" 7 android:drawable="@drawable/bar_dn"/> 8 <!-- 第二进度图 --> 9 <item 10 android:id="@+id/SecondaryProgress" 11 android:drawable="@drawable/bar_up"/> 12 <!-- 进度度 --> 13 <item 14 android:id="@+android:id/progress" 15 android:drawable="@drawable/bar_dn"/> 16 17 </layer-list>
android:thumb="@drawable/thumb_bar" res\drawable\thumb_bar.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 4 <!-- 按下状态 --> 5 <item android:drawable="@drawable/thumb_dn" android:state_pressed="true"/> 6 7 <!-- 焦点状态 --> 8 <item android:drawable="@drawable/thumb_up" android:state_focused="true"/> 9 10 <!-- 默认状态 --> 11 <item android:drawable="@drawable/thumb_up"/> 12 13 </selector>
1 package com.example.numberseekbar; 2 3 import java.util.Timer; 4 import java.util.TimerTask; 5 import android.annotation.SuppressLint; 6 import android.app.Activity; 7 import android.graphics.Color; 8 import android.os.Bundle; 9 import android.os.Handler; 10 import android.os.Message; 11 12 public class MainActivity extends Activity { 13 private NumberSeekBar pb, pb1, pb2; 14 15 @SuppressLint("HandlerLeak") 16 Handler handler = new Handler() { 17 @Override 18 public void handleMessage(Message msg) { 19 switch (msg.what) { 20 case 1: 21 pb.setProgress(pb.getProgress() + 5); 22 pb1.setProgress(pb1.getProgress() + 5); 23 pb2.setProgress(pb2.getProgress() + 10); 24 break; 25 } 26 } 27 }; 28 29 @Override 30 protected void onCreate(Bundle savedInstanceState) { 31 super.onCreate(savedInstanceState); 32 setContentView(R.layout.activity_numberseekbar); 33 pb = (NumberSeekBar) findViewById(R.id.bar0); 34 pb1 = (NumberSeekBar) findViewById(R.id.bar1); 35 pb2 = (NumberSeekBar) findViewById(R.id.bar2); 36 init(); 37 start(); 38 } 39 40 private void init() { 41 pb.setTextSize(20);// 设置字体大小 42 pb.setTextColor(Color.WHITE);// 颜色 43 pb.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效 44 pb.setImagePadding(0, 1);// 可以不设置 45 pb.setTextPadding(0, 0);// 可以不设置 46 47 pb1.setTextSize(20);// 设置字体大小 48 pb1.setTextColor(Color.WHITE);// 颜色 49 pb1.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效 50 pb1.setImagePadding(0, 1);// 可以不设置 51 pb1.setTextPadding(0, 0);// 可以不设置 52 53 pb2.setTextSize(20);// 设置字体大小 54 pb2.setTextColor(Color.WHITE);// 颜色 55 pb2.setMyPadding(10, 10, 10, 10);// 设置padding 调用setpadding会无效 56 pb2.setImagePadding(0, 1);// 可以不设置 57 pb2.setTextPadding(0, 0);// 可以不设置 58 } 59 60 private void start() { 61 TimerTask tt = new TimerTask() { 62 public void run() { 63 handler.sendEmptyMessage(1); 64 } 65 }; 66 Timer timer = new Timer(); 67 timer.schedule(tt, 1000, 2000); 68 } 69 70 }
bar_dn.png
bar_up.png
popwindow_bg1.PNG
thumb_dn.png
thumb_up.png