美文网首页
自定义RatingBar评分控件

自定义RatingBar评分控件

作者: CaoMeng | 来源:发表于2017-09-13 12:19 被阅读65次

    功能:随着手指滑动或者点击实现星星选中显示(黄色代表选中、灰色代表未选中)。
    废话少说,开始开车。下面效果图片:


    RatingBar.gif

    功能分析:
    1、自定义的属性:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="RatingBar">
            <attr name="unSelected" format="reference"></attr>
            <attr name="selected" format="reference"></attr>
            <attr name="starNum" format="integer"></attr>
            <attr name="gap" format="integer"></attr>
        </declare-styleable>
    </resources>
    

    unSelected:未选中显示的图片(灰色星星)
    selected:选中显示的图片(黄色的星星)
    starNum:绘制星星的数量
    gap:每两个星星之间间距
    2、自定义RatingBar

    public class RatingBar extends View {
        private int mStarNum =5;
        private Bitmap mSelectedBitmap;
        private Bitmap mUnSelectedBitmap;
        private int mCurrentGrade=0;
        private int mGap=5;
        public RatingBar(Context context) {
            this(context,null);
        }
        public RatingBar(Context context, AttributeSet attrs) {
            this(context, attrs,0);
        }
        public RatingBar(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
            mStarNum = array.getInteger(R.styleable.RatingBar_starNum, mStarNum);
            mGap=array.getInteger(R.styleable.RatingBar_gap,mGap);
            int selected_resourceId = array.getResourceId(R.styleable.RatingBar_selected, 0);
            if (selected_resourceId==0){
                throw new RuntimeException("请设置selected属性");
            }else{
                mSelectedBitmap= BitmapFactory.decodeResource(getResources(),selected_resourceId);
            }
            int unSelected_resourceId = array.getResourceId(R.styleable.RatingBar_unSelected, 0);
            if (unSelected_resourceId==0){
                throw new RuntimeException("请设置unSelected属性");
            }else{
                mUnSelectedBitmap=BitmapFactory.decodeResource(getResources(),unSelected_resourceId);
            }
            array.recycle();
        }
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int width_bitmap = mSelectedBitmap.getWidth();
            int height_height = mSelectedBitmap.getHeight();
            int width=width_bitmap*mStarNum+(mStarNum-1)*mGap;//计算控件的宽度
            int height = height_height;//计算控件的高度
            setMeasuredDimension(width,height);
        }
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            for (int i = 0; i <mStarNum ; i++) {
                int x=mSelectedBitmap.getWidth()*i+mGap*i;
                if (mCurrentGrade>i){
                    canvas.drawBitmap(mSelectedBitmap,x,0,null);
                }else{
                    canvas.drawBitmap(mUnSelectedBitmap,x,0,null);
                }
            }
        }
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
    //                break;
                case MotionEvent.ACTION_MOVE:
                    /*获取到滑动的位置*/
                    float x = event.getX();
                    int currentGrade= (int) (x/(float) (mSelectedBitmap.getWidth()+mGap)+1);
                    if (currentGrade<0){
                        mCurrentGrade=0;
                    }
                    if (currentGrade>mStarNum){
                        mCurrentGrade=mStarNum;
                    }
                    if (mCurrentGrade==currentGrade){
                        return true;
                    }
                    mCurrentGrade=currentGrade;
                    invalidate();
                    break;
    //            case MotionEvent.ACTION_UP:
    //                break;
            }
    //        return super.onTouchEvent(event);
            return true;//设置返回为true,否则不会进入onTouchEvent()这个方法。
        }
    }
    

    这里把MotionEvent.ACTION_DOWN事件加入进来实现点击也可以实现评分,否则评分效果只有滑动才能实现评分,点击不能实现评分。

    相关文章

      网友评论

          本文标题:自定义RatingBar评分控件

          本文链接:https://www.haomeiwen.com/subject/pemksxtx.html