自定义RatingBar/SeekBar,重载样式
Android系统自带的是星星,我们不能随心所欲的更换自己喜欢的图片,下面我就来讲讲如何制作自己的RatingBar样式。
1、在res/data/style.xml文件中定义种样式:
<resources> <style name="myratingbar" parent="@android:style/Widget.RatingBar.Small"> <item name="android:progressDrawable"> @drawable/myratingbar </item> <item name="android:minHeight">36dip</item> <item name="android:maxHeight">36dip</item> <style></resources>
其中继承的父类可以选择RatingBar,RatingBar.Indicator,RatingBar.Small;
大小可以自己定义。
注意:RatingBar,RatingBar.Indicator,RatingBar.Small的不同点除了他们的显示大小不同以外,主要的还有Ratingbar中的IsIndicator属性是false,其他两种是true.该属性为false表示可以相应用的点击事件,通过这种方式可以和用户交互。
2、在res/drawable/myratingbar.xml文件指定不同图层的图片资源
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+android:id/background" android:drawable="@drawable/myratingbar_off" /><item android:id="@+android:id/secondaryProgress"android:drawable="@drawable/myratingbar_half" /><item android:id="@+android:id/progress" android:drawable="@drawable/myratingbar_on" /></layer-list>
android评分条RatingBar自定义设置
http://fariytale.iteye.com/blog/1260673
RatingBar自定义设置
http://wang-peng1.iteye.com/blog/720956
SeekBar自定义
http://heji.iteye.com/blog/669266
Android下修改SeekBar样式
http://blog.csdn.net/vrix/archive/2010/08/03/5785676.aspx
垂直显示的SeekBar
import android.content.Context;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.KeyEvent;import android.view.MotionEvent;import android.widget.AbsSeekBar;public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; private int height; private int width; public interface OnSeekBarChangeListener { void onProgressChanged(VerticalSeekBar VerticalSeekBar, int progress, boolean fromUser); void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar); void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar); } private OnSeekBarChangeListener mOnSeekBarChangeListener; public VerticalSeekBar(Context context) { this(context, null); } public VerticalSeekBar(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.seekBarStyle); } public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) { mOnSeekBarChangeListener = l; } void onStartTrackingTouch() { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(this); } } void onStopTrackingTouch() { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(this); } } void onProgressRefresh(float scale, boolean fromUser) { Drawable thumb = mThumb; if (thumb != null) { setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE); invalidate(); } if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser); } } private void setThumbPos(int w, Drawable thumb, float scale, int gap) { int available = w+getPaddingLeft()-getPaddingRight(); int thumbWidth = thumb.getIntrinsicWidth(); int thumbHeight = thumb.getIntrinsicHeight(); available -= thumbWidth; // The extra space for the thumb to move on the track available += getThumbOffset() * 2; int thumbPos = (int) (scale * available); int topBound, bottomBound; if (gap == Integer.MIN_VALUE) { Rect oldBounds = thumb.getBounds(); topBound = oldBounds.top; bottomBound = oldBounds.bottom; } else { topBound = gap; bottomBound = gap + thumbHeight; } thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound); } protected void onDraw(Canvas c) { c.rotate(-90); c.translate(-height,0); super.onDraw(c); } protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { width = 22; height = 160; this.setMeasuredDimension(width, height); }@Overridepublic void setThumb(Drawable thumb){ mThumb = thumb;super.setThumb(thumb);} protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldw, oldh); } public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: setPressed(true); onStartTrackingTouch(); trackTouchEvent(event); break; case MotionEvent.ACTION_MOVE: trackTouchEvent(event); attemptClaimDrag(); break; case MotionEvent.ACTION_UP: trackTouchEvent(event); onStopTrackingTouch(); setPressed(false); break; case MotionEvent.ACTION_CANCEL: onStopTrackingTouch(); setPressed(false); break; } return true; } private void trackTouchEvent(MotionEvent event) { final int Height = getHeight(); final int available = Height - getPaddingBottom() - getPaddingTop(); int Y = (int)event.getY(); float scale; float progress = 0; if (Y > Height - getPaddingBottom()) { scale = 0.0f; } else if (Y < getPaddingTop()) { scale = 1.0f; } else { scale = (float)(Height - getPaddingBottom()-Y) / (float)available; } final int max = getMax(); progress = scale * max; setProgress((int) progress); } private void attemptClaimDrag() { if (getParent() != null) { getParent().requestDisallowInterceptTouchEvent(true); } } public boolean dispatchKeyEvent(KeyEvent event) { if(event.getAction()==KeyEvent.ACTION_DOWN) { KeyEvent newEvent = null; switch(event.getKeyCode()) { case KeyEvent.KEYCODE_DPAD_UP: newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_RIGHT); break; case KeyEvent.KEYCODE_DPAD_DOWN: newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT); break; case KeyEvent.KEYCODE_DPAD_LEFT: newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_DOWN); break; case KeyEvent.KEYCODE_DPAD_RIGHT: newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_UP); break; default: newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,event.getKeyCode());break; } return newEvent.dispatch(this); } return false; }}
关于SeekBar无法拖到最大值的解决办法:
seekbar的android:layout_width设置为fill_parent。
假如seekbar的max值比较小的话,那无法拖到最后的最大值。
解决方法很简单,加padding:
android:paddingLeft="13dip"
android:paddingRight="13dip"
1 楼 gangbener 2012-02-21 "Android系统自带的是星星,我们不能随心所欲的更换自己喜欢的图片",现在可以换图片了,在xml中加入"android:progressDrawable"就可以