Розовая область: по этой области овал должен двигаться по вертикали. Белый шарик должен перетаскиваться по нижней линии овала .
Как это можно реализовать? Вопрос в том как вычислять позицию шарика так чтобы она двигалась по нижней линии овала!?
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);
}
}
Возьмите такой кастомный CircleSeekbar - изучите его исходники и вперед.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
При данном коде, Picasso создается каждый раз или же там существует что-то, что не позволяет создавать один и тот же объект Picasso?
использую spring-data-jpa и postgresql, возможно ли через какую-нибудь аннотацию дать права конкретному пользователю на чтение таблицы, например через...
мне нужно сделать что-то типа элемента товара, что-то типа элементов в интернет магазинах, каждый товар будет иметь фотографию, описание и кнопку...