IndoorAtlas SDK 2.0:如何使用毕加索调整图像大小?

时间:2016-01-02 14:06:28

标签: java android picasso indoor-positioning-system

显然,我正在开发一个室内定位系统,我想调整使用picasso库从服务器获取的图像的大小,但是我得到一个空指针异常错误,其中说:尝试从字段读取' double com.indooratlas.android.sdk.resources.IALatLng.latitude'在空对象引用

我知道为什么我得到这个空指针异常,但我没有看到任何其他方法来调整图像大小。 以下是名为Extra_Activity的 ImageViewActivity ,其中不包含完整代码,仅包含相关代码段:

public class Extra_activity extends FragmentActivity
{
    private static final float dotRadius = 1.0f;
    private static final int MAX_DIMENSION = 2048;
    private IALocationManager mIALocationManager;
    private IAResourceManager mResourceManager;
    private IATask<IAFloorPlan> mPendingAsyncResult;
    //private IAFloorPlan mFloorPlan;
    private BlueDotView mImageView;
    private Target mLoadTarget;
    private static final String TAG ="FloorPlanLoader";
    private IALatLng latLng;

    private IALocationListener mIALocationListener = new IALocationListener()
    {
        @Override
        public void onLocationChanged(IALocation location) {
            Log.d(TAG, "location is: " + location.getLatitude() + "," + location.getLongitude());
            if (mImageView != null && mImageView.isReady()) {
                latLng = new IALatLng(location.getLatitude(), location.getLongitude());
                //PointF point = mFloorPlan.coordinateToPoint(latLng);
                //mImageView.setDotCenter(point);
                //mImageView.postInvalidate();
            }
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
       }
    };

    private IARegion.Listener mRegionListener = new IARegion.Listener()
    {
        @Override
        public void onEnterRegion(IARegion region) {
            if (region.getType() == IARegion.TYPE_FLOOR_PLAN) {
                String id = region.getId();
                Log.d(TAG, "floorPlan changed to " + id);
                fetchFloorPlan(id);
            }
        }

        @Override
        public void onExitRegion(IARegion region) {
            // leaving a previously entered region
        }
   };

   private void showFloorPlanImage(final IAFloorPlan floorPlan) {
        final String filePath = floorPlan.getUrl();
        if (mLoadTarget == null)
        {
            mLoadTarget = new Target()
            {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from)
                {
                    Log.d(TAG, "onBitmap loaded with dimensions: " + bitmap.getWidth() + "x"
                            + bitmap.getHeight());
                    mImageView.setImage(ImageSource.bitmap(bitmap.copy(bitmap.getConfig(), true)));
                    mImageView.setRadius(floorPlan.getMetersToPixels() * dotRadius);
                    PointF point = floorPlan.coordinateToPoint(latLng);
                    mImageView.setDotCenter(point);
                    mImageView.postInvalidate();
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                }

                @Override
                public void onBitmapFailed(Drawable placeHolderDrawable) {
                    Toast.makeText(Extra_activity.this, "Failed to load bitmap",
                            Toast.LENGTH_SHORT).show();
                }
            };
        }
        RequestCreator request = Picasso.with(this).load(filePath).rotate(90); //.resize(0,0)
        final int bitmapWidth = floorPlan.getBitmapWidth();
        final int bitmapHeight = floorPlan.getBitmapHeight();
        if (bitmapHeight > MAX_DIMENSION) {
            request.resize(0, MAX_DIMENSION);
        } else if (bitmapWidth > MAX_DIMENSION) {
            request.resize(MAX_DIMENSION, 0);
        }
        request.into(mLoadTarget);
        Log.w(TAG, "showFloorPlanImage: " + filePath);
        progressDialog.dismiss();
    }

    private void fetchFloorPlan(String id) {
        cancelPendingNetworkCalls();
        final IATask<IAFloorPlan> asyncResult = mResourceManager.fetchFloorPlanWithId(id);
        mPendingAsyncResult = asyncResult;
        if (mPendingAsyncResult != null) {
            mPendingAsyncResult.setCallback(new IAResultCallback<IAFloorPlan>() {
                @Override
                public void onResult(IAResult<IAFloorPlan> result) {
                    Log.d(TAG, "fetch floor plan result:" + result);
                    if (result.isSuccess() && result.getResult() != null)
                    {
                        //mFloorPlan = result.getResult();
                        showFloorPlanImage(result.getResult());
                    } else {
                        if (!asyncResult.isCancelled()) {
                            Toast.makeText(Extra_activity.this,
                                    (result.getError() != null
                                            ? "error loading floor plan: " + result.getError()
                                            : "access to floor plan denied"), Toast.LENGTH_LONG)
                                    .show();
                        }
                    }
                }
            }, Looper.getMainLooper());
        }
    }

    private void cancelPendingNetworkCalls() {
        if (mPendingAsyncResult != null && !mPendingAsyncResult.isCancelled()) {
            mPendingAsyncResult.cancel();
        }
    }
}

来自logcat的错误消息:

NullPointerException

(Extra_activity.java:154)是指 showFloorPlanImage 方法中的 PointF point = floorPlan.coordinateToPoint(latLng); PointF point = floorPlan.coordinateToPoint(latLng); 应该放在onLocationChanged方法中但是,在这段代码中,我不能使用 PointF point = floorPlan.coordinateToPoint(latLng) ; 在该方法中作为变量 floorplan 只能在 showFloorPlanImage 方法中访问。这整个导致空指针异常。

我问了一个类似的问题,我使用了不同的方法(不同的代码),然而,我能够调整图像大小,但蓝点显示在视线之外:&#34; {{3 }}&#34;

什么是正确的解决方案,因为我的方法似乎都没有用?非常感谢你能帮助我解决这个问题。

2 个答案:

答案 0 :(得分:0)

我真的不明白你的Nullpointer和图像大小调整之间的关系。但是,你想要实现的只是在我理解正确的情况下调整图像大小。而不是试图调整图像本身,为什么不改变其容器的大小? (这里是ImageView)。您可以使用getLayoutParams().heightgetLayoutParams().width或xml(例如此示例)来实现此目的:

<ImageView
    android:id="@+id/image"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:src="@drawable/image" />

答案 1 :(得分:0)

很难从不完整的代码片段中分辨出来,但对我来说,看起来你的错误与Picasso或IndoorAtlas无关。您似乎使用our example code作为模板,但使cb1.GetValue(LookUp.LookUpItemsSourceProperty)成为实例变量。 因此,在latLng初始化之前,您可以调用(并且显然被调用)您获得NPE的onBitmapLoaded()。后者在latLng回调时异步发生(在这种情况下,在您需要它之后)。在使用异步回调构造时,您不能依赖于特定的调用顺序。

祝你好运!