【问题标题】:Animating a fling gesture on a Google map在 Google 地图上为投掷手势制作动画
【发布时间】:2018-06-26 23:22:02
【问题描述】:

我在地图上有一个叠加层 (ImageView),我在上面捕获了多个事件,例如滚动、双击或一扔,然后在下面的地图上模拟这些事件。滚动和双击正在工作,但我不知道如何处理投掷事件。这是我的代码:

@Override
public boolean onDoubleTap(MotionEvent e) {
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn(), DEFAULT_ZOOM_SPEED, null);
    return true;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    LatLng target = mGoogleMap.getCameraPosition().target;
    Point screenPoint = mGoogleMap.getProjection().toScreenLocation(target);
    Point newPoint = new Point(screenPoint.x + (int) distanceX, screenPoint.y + (int) distanceY);
    LatLng mapNewTarget = mGoogleMap.getProjection().fromScreenLocation(newPoint);

    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
                mapNewTarget, mGoogleMap.getCameraPosition().zoom);
    mGoogleMap.moveCamera(update);
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   }

【问题讨论】:

    标签: android google-maps android-layout google-maps-android-api-2


    【解决方案1】:

    就像在其他情况下(onDoubleTap()onScroll())在您的 onFling() 方法中,您可以实现您想要的一切,例如:

    1) 滚动(您需要将velocityXvelocityY 转换为distanceXdistanceY):

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        final float FLING_DURATION = 0.1f;
        float distanceX = - FLING_DURATION * velocityX;
        float distanceY = - FLING_DURATION * velocityY;
    
        LatLng target = mGoogleMap.getCameraPosition().target;
        Point screenPoint = mGoogleMap.getProjection().toScreenLocation(target);
        Point newPoint = new Point(screenPoint.x + (int) distanceX, screenPoint.y + (int) distanceY);
        LatLng mapNewTarget = mGoogleMap.getProjection().fromScreenLocation(newPoint);
    
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
                mapNewTarget, mGoogleMap.getCameraPosition().zoom);
        mGoogleMap.animateCamera(update);
    
        return true;
    }
    

    (也可以调整 FLING_DURATION)

    2) 改变地图倾斜度:

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float tilt = velocityY > 0 ? 90 : 0;
        LatLng target = mGoogleMap.getCameraPosition().target;
        CameraUpdate update = CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
                .target(target)
                .tilt(tilt)
                .zoom(mGoogleMap.getCameraPosition().zoom)
                .bearing(mGoogleMap.getCameraPosition().bearing)
                .build());
        mGoogleMap.animateCamera(update);
    
        return true;
    }
    

    3) 或地图类型:

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    
        int mapType = mGoogleMap.getMapType();
        if (velocityX > 0) {
            mapType++;
            if (mapType > GoogleMap.MAP_TYPE_HYBRID) {
                mapType = GoogleMap.MAP_TYPE_HYBRID;
            }
        } else {
            mapType--;
            if (mapType < GoogleMap.MAP_TYPE_NORMAL) {
                mapType = GoogleMap.MAP_TYPE_NORMAL;
            }
        }
        return true;
    }
    

    等等。

    注意!并且不要忘记从您的onDown() 方法中返回true,否则其他手势都不起作用。

    【讨论】:

    • 谢谢,但我仍然无法模拟真实的地图。我之前设法做类似的事情,但看起来不自然,动画很慢而且开始晚了。
    • @Sicisom 什么是“真正的一掷千金”?是“1)滚动(您需要将velocityX和velocityY转换为distanceX和distanceY):”?
    • 我的意思是当你在应用程序上扔谷歌地图时你得到的动画。如何将速度转换为距离?
    • 请看答案的第 1) 点:distance = time * velocity.
    • 我觉得我们在这里绕圈子。你试过 1) 吗?因为它不起作用。这看起来不像我第一次重播所说的那样自然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2012-02-29
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多