SeekBar Thumb position issue

前端 未结 2 1158
时光说笑
时光说笑 2020-12-30 16:15

I\'m trying to do a \"labeled\" thumb for my Seekbar. The objective is to customize a text above the thumb every time the Seekbar position changes.

I\'m doing this:

2条回答
  •  醉梦人生
    2020-12-30 17:02

    I've ended up extending from SeekBar, and overriding the onMeasure() and onDraw methods(), that was the only way I've found to so the label/thumb thing work.

    Posting it to help others:

    ...
        @Override
        protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
         {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            if (labelBackground != null)
            {
    
                viewWidth = getMeasuredWidth();
                barHeight = getMeasuredHeight();// returns only the bar height (without the label);
                setMeasuredDimension(viewWidth, barHeight + labelBackground.getHeight());
            }
    
        }
    
    
    
        @Override
        protected synchronized void onDraw(Canvas canvas)
        {
            if (labelBackground != null)
            {
                barBounds.left = getPaddingLeft();
                barBounds.top = labelBackground.getHeight() + getPaddingTop();
                barBounds.right = barBounds.left + viewWidth - getPaddingRight() - getPaddingLeft();
                barBounds.bottom = barBounds.top + barHeight - getPaddingBottom() - getPaddingTop();
    
                progressPosX = barBounds.left + ((float) this.getProgress() / (float) this.getMax()) * barBounds.width();
    
                labelPos.x = (int) progressPosX - labelOffset;
                labelPos.y = getPaddingTop();
    
                progressDrawable = getProgressDrawable();
                progressDrawable.setBounds(barBounds.left, barBounds.top, barBounds.right, barBounds.bottom);
                progressDrawable.draw(canvas);
    
                labelTextPaint.getTextBounds(labelText, 0, labelText.length(), labelTextRect);
    
                canvas.drawBitmap(labelBackground, labelPos.x, labelPos.y, labelBackgroundPaint);
                canvas.drawText(labelText, labelPos.x + labelBackground.getWidth() / 2 - labelTextRect.width() / 2, labelPos.y + labelBackground.getHeight() / 2 + labelTextRect.height() / 2, labelTextPaint);
    
                thumbX = (int) progressPosX - getThumbOffset();
                thumbDrawable.setBounds(thumbX, barBounds.top, thumbX + thumbDrawable.getIntrinsicWidth(), barBounds.top + thumbDrawable.getIntrinsicHeight());
                thumbDrawable.draw(canvas);
            } else
            {
                super.onDraw(canvas);
            }
        }
    

    Result:

    result

提交回复
热议问题