当前位置: 首页 > 知识库问答 >
问题:

MapView顶部的SurfaceView,Surface无效

柯宜年
2023-03-14

我正在尝试实现一个MapView,其中最上面是一个SurfaceView,它们都单独工作得很好,但是当我将它们都放在FrameLayout中时,我无法获得

getHolder().getSurface().isValid()

如真的。

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="true" >

    <com.google.android.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey="0Xja4jU2XxeYRsWmblq0ccK2EweYe469rQRgWFg"
        android:clickable="true"
        android:enabled="true" >
    </com.google.android.maps.MapView>

<com.example.tricorder.BallSurfaceView
    android:id="@+id/nixx"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
     />

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="124dp"
        android:src="@drawable/ballz" />

</FrameLayout>
</RelativeLayout>

SurfaceView代码:

公共类BallSurfaceView扩展SurfaceView实现Runnable {

float x, y, sensorX, sensorY, a, b, centerX, centerY;
int color = 0;
SurfaceHolder ourHolder;
Thread ourThread = null;
boolean isRunning = false;

public BallSurfaceView(Context context) {
    super(context);
    ourHolder = getHolder();
    x = y = sensorY = sensorX = 0;

}

public BallSurfaceView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    ourHolder = getHolder();
    x = y = sensorY = sensorX = 0;
    // TODO Auto-generated constructor stub
}

public BallSurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
    ourHolder = getHolder();
    x = y = sensorY = sensorX = 0;
    // TODO Auto-generated constructor stub
}

public void pause() {
    isRunning = false;
    while (true) {
        try {
            ourThread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        break;
    }
    ourThread = null;
}

public void resume() {
    isRunning = true;
    ourThread = new Thread(this);
    ourThread.start();
}

public void run() {
    // TODO Auto-generated method stub
    while (isRunning) {
        Surface sc = ourHolder.getSurface();
        if (!sc.isValid())
            continue;

        Canvas canvas = ourHolder.lockCanvas();
        //if (color == 0)
            //canvas.drawRGB(0, 0, 0);
    //  else if (color == 1)
            //canvas.drawRGB(127, 127, 127);
        //else
            //canvas.drawRGB(255, 255, 255);
        centerX = canvas.getWidth() / 2;
        centerY = canvas.getHeight() / 2;
        x += sensorX;
        y += sensorY;
        a = centerX + x;
        b = centerY + y;

        if (x > (1.5 * centerX)) {
            x = (float) (1.5 * centerX);
        }
        if (x <= (0.2 * centerX)) {
            x = (float) (0.2 * centerX);
        }
        if (y > (1.5 * centerX)) {
            y = (float) (1.5 * centerX);
        }
        if (y <= (0.2 * centerX)) {
            y = (float) (0.2 * centerX);
        }
        // if (a > canvas.getWidth())
        // a = canvas.getWidth();
        // if (b > canvas.getHeight())
        // b = canvas.getHeight();
        // if (a < 0)
        // a = 0;
        // if (b < 0)
        // b = 0;

        canvas.drawBitmap(GraphicActivity.ball, x, y, null);
        ourHolder.unlockCanvasAndPost(canvas);
    }
}

}

在MapActivity中创建:

受保护的void onCreate(Bundle saved instancestate){

    super.onCreate(savedInstanceState);
            mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mMag = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    mAcc = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

    ball = BitmapFactory.decodeResource(getResources(), R.drawable.ballz);
    ourSurfaceView = new BallSurfaceView(this);
    ourSurfaceView.resume();
    //ourSurfaceView = (BallSurfaceView) findViewById(R.id.nixx);
    setContentView(R.layout.activity_graphic);

    mapView = (MapView) findViewById(R.id.mapView);
    List mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.ballz);
    CustomItemizedOverlay itemizedOverlay = new CustomItemizedOverlay(
            drawable, this);

    GeoPoint point = new GeoPoint(37985339, 23716735);
    OverlayItem overlayitem = new OverlayItem(point, "Hello",
            "I'm in Athens, Greece!");

    itemizedOverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedOverlay);

    MapController mapController = mapView.getController();
    mapController.animateTo(point);
    mapController.setZoom(6);
}

我总是达到

如果(!sc.isValid())

并将sc.isValid()设置为false。

共有1个答案

裴建华
2023-03-14

没关系,我让它工作了。问题是我没有将XML中的表面视图链接到表面视图实例,如下所示:

our surface view =(BallSurfaceView)findViewById(r . id . nixx);

然后,我不需要创建我们的SurfaceView的“新”实例。

 类似资料:
  • 我对Android的SurfaceView类在最新的相机API上使用它进行开发遇到了麻烦。我再次检查了我的最低API水平是21。 我用两种方法实现了这一点,一种是在XML中创建SurfaceView,然后将它的值赋予我的私有SurfaceView,或者用公共构造函数创建它。 快进错误: 我认为这与SurfaceView的大小或下垫面有关。也许我没有正确使用它,但是Android文档说它可以用Sur

  • The surface including Country and Ocean. The default color scheme is 0xffffff. The color scheme can be set through configure() as shown in the example below: controller.configure({         color: {   

  • surface根据PHP代码配置创建Table、Form页面  如果使用ThinkPHP的同学使用内置助手类,对tp更友好,可以查看/vender/iszsw/test/ThinkPhp.php中示例 github https://github.com/iszsw/surface gitee   https://gitee.com/iszsw/surface 演示地址 http://demo.su

  • 问题内容: 我不确定我是否完全理解这两者之间的区别。 有人可以解释为什么我要在另一个上使用它们,以及它们之间的区别吗? 问题答案: 用于通过使用属性来调整元素。 用于测量相对于上一个元素到元素的外部距离。 此外,行为可以依赖于位置,种类而不同,或。

  • 问题内容: 我正在尝试进行反向无限滚动。我有,我收到了近10篇最近的评论,并希望用户能够滚动评论列表 最多 检索下一个10 -类似FB它显示了最近的评论的“获取前”链接,而是通过滚动事件,而不是链接。 我从http://jsfiddle.net/vojtajina/U7Bz9/开始,尝试将其修改为反向无限滚动,并很快以如下形式结束了: http://jsfiddle.net/digger69/Fw

  • 我试图做一个谷歌地图活动,但我得到一个LogCat错误和我的应用程序崩溃。当我注册API密钥时,我使用了android提供的编码,所以我不知道为什么它不能工作。我需要帮助解决这个问题。 洛克卡特 Java文件