2016-07-18 6 views
1

Я пытаюсь реализовать пользовательский SeekBar, расширив AppCompatSeekBar. Мое намерение состоит в том, чтобы нарисовать некоторые элементы над большим пальцем. Я попытался получить оценки большого пальца для этого, но это неточно в первой ничьей.Обычная панель поиска Android: не удается получить точное положение большого пальца в методе OnDraw

Вот что я делаю на моем OnDraw метод:

protected void onDraw(Canvas canvas) { 
    /*Rotates the seekbar, as I need it to be vertical*/ 
    canvas.rotate(-90); 
    canvas.translate(-getHeight(), 0); 
    super.onDraw(canvas); 
    canvas.save(); 

    Paint paint = new Paint(); 
    paint.setColor(ContextCompat.getColor(getContext(),R.color.accent)); 
    paint.setStrokeWidth(2); 
    paint.setStyle(Paint.Style.STROKE); 

    Rect thumbBounds = this.getThumb().getBounds(); 
    int offset = getThumbOffset(); 
    Log.d(TAG,"ThumbOffset:"+offset+ " RectX:" + thumbBounds.centerX()); 
    thumbBounds.offset(offset,0); 

    canvas.drawRect(thumbBounds, paint);   
    canvas.drawText(Integer.toString(getProgress()),thumbBounds.centerY(),-thumbBounds.centerX(),textPaint); 
    canvas.restore(); 
} 

В первый раз он загружает, выглядит следующим образом (неправильно)
off center bounds

После того как я перетащить пальцем вокруг, выглядит следующим образом (исправить):
centered bounds

Кроме того, если я минимизировать свою деятельность несколько раз, границы сходят с ума:
enter image description here

Таким образом, я предполагаю, что получаю в анимацию несколько фреймов нескольких кадров. Мой вопрос: как я могу это компенсировать?

Благодаря

ответ

0

Хотя я не мог найти хороший способ получить позицию непосредственно из пальца, я нашел in this example хороший способ сделать это косвенно. Мне нужно было только отрегулировать измерения для вертикальной полосы. Поместите этот код в метод onDraw:

//Calculating the size of the text 
    text = String.valueOf(getProgress() - maxValue); 
    textPaint.getTextBounds(text,0,text.length(),textBounds); 

    //The height of the displacement area of our bar (the height - the padding - the thumb size) 
    int bottomPadding = getPaddingLeft() - getThumbOffset(); 
    int topPadding = getPaddingRight() - getThumbOffset(); 
    int height = getHeight() - bottomPadding - topPadding; 

    float progressRatio = (float) getProgress()/getMax(); 
    float thumbOffset = getThumb().getIntrinsicWidth() * (.5f - progressRatio); 

    // In our rotated canvas, positive x is higher, positive Y is more to the left 
    float thumbX = progressRatio * height + bottomPadding + thumbOffset; 
    float thumbY = getWidth()/2f; 
    //Since we rotate the canvas again when drawing the text, we need to translate the coords for the text 
    float textX = thumbY - textBounds.width()/2f; 
    float textY = -(thumbX - textBounds.height()/2f);