2011-07-15 3 views
0

画面上で座標を合わせるビューを表示しようとすると、センサのデータに依存します。私はthat SO questionで説明されているテキストを表示することができましたが、代わりにTextViewsを表示しようとしていますが、TextViewsでinvalidate()を呼び出すと描画されません...invalidate()を実行しているときにTextViewが描画されない

誰かが助けることができますか?

おかげ

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

ここで私はこれが解決策である場合、私は知らない

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 

} 

答えて

0

...、センサーデータを取得し、私のARViews座標を更新し、うまくいけば、それらを描きます私はこれが別の問題であることを知っています。

メソッドでinvalidate()コールを削除します。 1回に1回、無効にする必要があります。 onDraw()からそれを削除すると、新しいセンサーデータがある場合にのみ画面が更新されます。画面は実際にはonDraw()の葉まで描画されません。

また、forループの後にinvalidate()へのコールをonDraw()に移動し、onSensorChanged()から完全に削除することができます。これにより、センサーデータを持っているかどうかにかかわらず画面が常に再描画されます。

0

ビューの位置のみを変更しているようです。あなたはinvalidateを呼び出す必要はなく、onDrawを覆す必要はありません。そのような種類のものについては、OSはいつ再描画するかを知っています。 InvalidateとonDrawはカスタム図面専用です。

関連する問題