TextView не отображается при выполнении invalidate () - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь отобразить виды, координаты которых на экране зависят от данных датчиков. Мне удалось показать текст, как объяснено в этом вопросе , и сейчас я пытаюсь вместо этого показать некоторые TextViews, но при вызове invalidate () в моих TextViews они не отображаются ...

Кто-нибудь может помочь?

Спасибо

ARView.java

public class ARView extends TextView
{ 
    public String name;
    public float azimuth;
    public float distance;
    public float inclination;
    public Location location;

    public ARView(Context context)
    {        
        super(context);
        setText(name);
    }
}

ARActivity.java

Здесь я добавляю свой ARView в родительский вид.

public class ARActivity extends Activity{

    private ARLayout ar;
    private CBCameraView cv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            ar = new ARLayout(getApplicationContext());

            cv = new CBCameraView(this.getApplicationContext());

            FrameLayout rl = new FrameLayout(this.getApplicationContext());

            rl.addView(cv, GlobalVars.screenWidth, GlobalVars.screenHeight); 
            rl.addView(ar, GlobalVars.screenWidth, GlobalVars.screenHeight); 

            setContentView(rl);

            Location location = new Location("me");
            location.setLatitude(41.371974);
            location.setLongitude(2.166978);

            ARView fs = new ARView(this.getApplicationContext());
            fs.azimuth = 0;
            fs.inclination = 0;
            fs.location = location;
            fs.name="Bar seco";
            ar.addARView(fs);                    
    }
}

ARLayout.java

Здесь я получаю данные датчиков, обновляю свои координаты ARView и, надеюсь, их рисую ...

public class ARLayout extends View implements LocationListener, SensorEventListener
{

    // ...

    @Override
    public void onSensorChanged(SensorEvent event) {

        // here I get sensors data and update my views

        for(int i=0; i<nArViews; i++)
        {

            ARView view = arViews.get(i);            

            int x = ...; // new x coordinate of my ARView
            int y = ...; // new y coordinate of my ARView

            view.layout(x, y, view.getBottom(), view.getRight());  // set new coordinates to my ARViews

        }

        invalidate(); // draw my ARLayout       
    }

    public void onDraw(Canvas c)
    {
        for(int i=0; i<nArViews; i++)
        {                
            ARView view = arViews.get(i);
            view.invalidate();  // I thought it would draw my ARViews, but it doesn't :(
        }
    }

    // more stuff   

}

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Похоже, вы только меняете позиции вида. Вам не нужно вызывать аннулировать и вам не нужно отменять onDraw. Для таких вещей ОС знает, когда перерисовывать. Invalidate и onDraw предназначены только для пользовательского рисования.

0 голосов
/ 15 июля 2011

Я не знаю, является ли это решением конкретной проблемы, но я знаю, что это другая проблема.

Удалите вызов invalidate() в методе onDraw().Вы должны только назвать недействительным один раз за розыгрыш.Удаление его из onDraw() обеспечит обновление экрана только при наличии новых данных датчика.Экран фактически не будет рисовать, пока не уйдет onDraw().

Кроме того, вы можете переместить вызов на invalidate() ПОСЛЕ цикла for в onDraw() и полностью удалить его из onSensorChanged().Это заставит экран постоянно перерисовываться независимо от того, есть у вас данные датчика или нет.

...