Нарисовать овальный SeekBar с ограничениями

147
03 апреля 2019, 07:30

Розовая область: по этой области овал должен двигаться по вертикали. Белый шарик должен перетаскиваться по нижней линии овала .

Как это можно реализовать? Вопрос в том как вычислять позицию шарика так чтобы она двигалась по нижней линии овала!?

UP2: Как я только не пробовал) Но у меня не получается вычислить Y для позиции X Один из вариантов который я смог сотворить..

public class AudioBalanceBar extends View {
    private Paint ovalPaint;
    private RectF ovalView;
    private float ovalHeight = 90f;
    private Bitmap thumb;
    private Paint thumbPaint;
    private float lastX;
    private float lastY;
    private float mRadius;

    public AudioBalanceBar(Context context) {
        super(context);
        init(context, null);
    }
    public AudioBalanceBar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }
    public AudioBalanceBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }
    private void init(Context context, @Nullable AttributeSet attributeSet){
        if (attributeSet != null){
        }
        thumb = BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_name);
        ovalPaint = new Paint();
        ovalPaint.setAntiAlias(true);
        ovalPaint.setColor(Color.BLACK);
        ovalPaint.setStrokeWidth(2f);
        ovalPaint.setStyle(Paint.Style.STROKE);
        thumbPaint = new Paint();
        thumbPaint.setAntiAlias(true);
    }
    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l, t, r, b);
        setOvalViewParams(getLeft(), getTop(), getRight(), getTop() + ovalHeight);
        mRadius = (float) (Math.min(ovalView.width(), ovalView.height()) / 2 * 0.8);
    }
    @Override
    public void draw(Canvas canvas) {
        if (ovalView != null){
            drawOvalView(canvas, ovalView, ovalPaint);
        }
        float a = ovalView.width() / 2;
        float b = (ovalView.height() / 2) + ovalView.top;
        float y = getY(a, b, 95f);
        float yO = getY(a, b, lastX) + ovalView.height();
        Log.d("vill", "\na:" + a + " b:" + b + " y:" + y + " lasX:" + lastX + " yO:" + yO);
        drawThumb(canvas, lastX, y);
        super.draw(canvas);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        lastX = x;
        lastY = y;

        setOvalViewParams(getLeft(), y - ovalHeight, getRight(), y);
        invalidate();
        return super.dispatchTouchEvent(event);
    }
    private void drawOvalView(Canvas canvas, RectF ovalView, Paint ovalPaint){
        canvas.drawOval(ovalView, ovalPaint);
    }
    private void setOvalViewParams(float left, float top, float right, float bottom){
        ovalView = new RectF(left, top, right, bottom);
    }
    private void drawThumb(Canvas canvas, float left, float top){
        Log.d("vill", "drawThumb top: " + top + " left: " + left);
        canvas.drawBitmap(thumb, left, top, thumbPaint);
    }
    private float getY(float a, float b, float x){
       // return (float) (Math.pow(b, 2d) * ((Math.pow(a, 2d) - Math.pow(x, 2d)) / Math.pow(a, 2d)));
        // (float) ((Math.pow(b, 2d) / Math.pow(a, 2d)) * (Math.sqrt(b * b * (a * a - x * x))));
        return (float) (b * Math.sin(x));
        //return (float) Math.sqrt(1 - (Math.pow(x / a, 2d)) * b);
    }
}
Answer 1

Возьмите такой кастомный CircleSeekbar - изучите его исходники и вперед.

READ ALSO
Picasso в цикле, создается ли он каждый раз?

Picasso в цикле, создается ли он каждый раз?

При данном коде, Picasso создается каждый раз или же там существует что-то, что не позволяет создавать один и тот же объект Picasso?

147
regexp. Как заменить все кроме шаблона?

regexp. Как заменить все кроме шаблона?

мне нужно получить SIP/101

139
spring-data jpa возможно ли дать права пользователю?

spring-data jpa возможно ли дать права пользователю?

использую spring-data-jpa и postgresql, возможно ли через какую-нибудь аннотацию дать права конкретному пользователю на чтение таблицы, например через...

163
Как создать элемент товара JavaFX? [закрыт]

Как создать элемент товара JavaFX? [закрыт]

мне нужно сделать что-то типа элемента товара, что-то типа элементов в интернет магазинах, каждый товар будет иметь фотографию, описание и кнопку...

144