首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

自定义RatingBar/SeekBar,满载样式

2012-09-08 
自定义RatingBar/SeekBar,重载样式Android系统自带的是星星,我们不能随心所欲的更换自己喜欢的图片,下面我

自定义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"就可以

热点排行