2011-07-15 23 views
0

我想显示视图,屏幕上的坐标取决于传感器数据。我设法显示一个文本,如that SO question中所解释的,我现在试图展示一些TextViews,但是在我的TextViews上调用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

在这里,我得到的传感器的数据,更新我的ARViews坐标,希望吸引他们......

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

我不知道这是解决方案到具体的问题,但我知道这是另一个问题。

删除invalidate()调用onDraw()方法。每次抽签只需要调用一次失效。从onDraw()中删除它将确保屏幕只有当您有新的传感器数据时才会更新。屏幕实际上不会画到onDraw()

或者,您可以在onDraw()的for循环后将呼叫移动到invalidate(),并从onSensorChanged()完全删除它。这将使屏幕不断重新绘制,无论您是否有传感器数据。

0

看来你只是在改变视图的位置。你不必调用无效,你不必在onDraw上推翻。对于那些操作系统知道何时重绘的东西。无效并且onDraw仅用于自定义绘图。