0

画面上の座標がセンサー データに依存するビューを表示しようとしています。そのSOの質問で説明されているようにテキストを表示することができましたが、代わりにいくつかのTextViewを表示しようとしていますが、TextViewでinvalidate()を呼び出すと、描画されません...

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

ありがとう

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   

}
4

2 に答える 2

0

これが特定の問題の解決策であるかどうかはわかりませんが、これが別の問題であることは知っています。

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

または、呼び出しをinvalidate()forループの後に移動してonDraw()、から完全に削除することもできますonSensorChanged()。これにより、センサーデータがあるかどうかに関係なく、画面が常に再描画されます。

于 2011-07-15T17:13:07.503 に答える
0

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

于 2011-07-15T17:31:48.230 に答える