Android LinearGradient и странное относительное позиционирование - PullRequest
3 голосов
/ 26 февраля 2011

У меня есть следующий код с LinearGradient, который выглядит так же, как и все остальные примеры.

public class CustomColourBar extends View
{

public CustomColourBar( Context context, AttributeSet attribs )
{
    super( context, attribs );
}    

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    setMeasuredDimension(170, 40);
}

@Override
protected synchronized void onDraw( Canvas canvas )
{
    int height = this.getMeasuredHeight();
    int width = this.getMeasuredWidth();

    LinearGradient shader = new LinearGradient(
        0, 0, 0, height, 
        Color.RED, Color.YELLOW,
        Shader.TileMode.CLAMP );

    Paint paint = new Paint(); 
    paint.setShader(shader);
    RectF fgRect = new RectF( 0, 0, width, height);

    canvas.drawRoundRect(fgRect, 7f, 7f, paint);

}
}

В макете это выдает следующее, что примерно правильно:

http://i.stack.imgur.com/Pqbx1.png

Однако, когда другие вещи изменяют позицию Y моего взгляда, это идет не так:

http://i.stack.imgur.com/bnyeU.png

LinearGradient использует абсолютную позицию относительно самого верхнего вида (т. Е. Диалогового окна). Я не могу на всю жизнь сообразить - почему?

Спасибо!

Rob

Ответы [ 2 ]

8 голосов
/ 16 июня 2012

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

Поэтому вам необходимо всегда рисовать фигуры на холсте вокруг оригинала и переводить холст в нужное положение.

Например:

НЕ:

canvas.drawCircle(posx, posy, radius);

DO:

canvas.save();
canvas.translate(posx, posy);
canvas.drawCircle(0,0,radius);
canvas.restore();

Надеюсь, это помогло!;)

0 голосов
/ 26 февраля 2011

В файле манифеста Android выберите используемое действие и убедитесь, что у свойства configChanges его ориентация отмечена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...