Пользовательское представление Android вызывается только при вызове onDraw один раз - PullRequest
3 голосов
/ 11 февраля 2012

Я сделал собственный вид, который должен анимировать точку на фоне в соответствии с некоторыми внешними данными.(работает как талисман с текстовыми представлениями)

представление затем добавляется в xml и android: задан фон.

представление отображается правильно, но не обновляется.некоторая отладка показала, что onDraw вызывается только один раз.чего не хватает?

код для моего пользовательского просмотра:

 public class Gmeter extends ImageView {
    private Bitmap dot;
    private float dotHeight, dotWidth;

    public Gmeter(Context context, AttributeSet attrs) {
        super(context, attrs);

        dot = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.g_dot);
        dotWidth = dot.getWidth();
        dotHeight = dot.getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

        float dataX =(float) Data.getX();

        float x = (getWidth()-dotWidth)/2f;
        float y = (getHeight()-dotHeight)/2f;

        x+= dataX * getWidth() /2f;

        canvas.drawBitmap(dot, x, y, null);
    }

}

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012

Что бы ни устанавливало x в Data, необходимо вызвать invalidate(), чтобы сообщить View, что ему нужно перерисовать на основе новых данных.View не может прочитать ваши мысли, чтобы узнать, когда появятся новые данные :)будет иметь отличный рецепт для тратить циклы процессора.

1 голос
/ 12 февраля 2012

Было бы довольно легко создать Runnable (с обработчиком), который вызывает invalidate ();16 раз в секунду или около того.Просто поместите handler.postDelay (this, delay);после вызова invalidate ();контролировать скорость воспроизведения.

1 голос
/ 11 февраля 2012

Возможно, не лучшая реализация, потому что она будет постоянно обновляться, но вы можете вызвать:

invalidate();

в методе onDraw (), и он будет перерисован.

...