Android 执行invalidate()时未绘制TextView
我试图显示屏幕上的坐标取决于传感器数据的视图。我按照中的说明显示了一个文本,现在我尝试显示一些文本视图,但是在我的文本视图上调用invalidate时,它们并没有被绘制出来 有人能帮忙吗 谢谢 ARView.java ARActivity.java 在这里,我将ARView添加到其父视图中Android 执行invalidate()时未绘制TextView,android,view,invalidation,Android,View,Invalidation,我试图显示屏幕上的坐标取决于传感器数据的视图。我按照中的说明显示了一个文本,现在我尝试显示一些文本视图,但是在我的文本视图上调用invalidate时,它们并没有被绘制出来 有人能帮忙吗 谢谢 ARView.java ARActivity.java 在这里,我将ARView添加到其父视图中 public class ARActivity extends Activity{ private ARLayout ar; private CBCameraView cv; @O
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
}
我不知道这是否是具体问题的解决方案,但我知道这是另一个问题 删除onDraw方法中的invalidate调用。每次绘制只需调用invalidate一次。将其从onDraw中删除将确保屏幕仅在您有新传感器数据时更新。在onDraw离开之前,屏幕实际上不会绘制
或者,您可以将调用移动到onDraw中for循环之后的invalidate,并将其完全从onSensorChanged中删除。这将使屏幕不断地重新绘制,无论您是否有传感器数据。看起来您只是在更改视图的位置。您不必调用invalidate,也不必否决onDraw。对于这类事情,操作系统知道何时重新绘制。无效和onDraw仅用于自定义图形
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
}