2

私は Android マップ v2works を正常に使用しています。場所のロング タッチでマーカーを追加および削除できます。

問題: マーカーをタッチした位置にゆっくりとドロップしたい。つまり、マーカーが画面の上部からドロップされたポイント (タッチされた位置) まで浮いているのをユーザーに見てもらいたい。

現在; マーカーはタッチした場所に表示されるだけなので、ドロップされたことを確認するには指を離す必要があります。画面の上から出てくるのがいいですね。

ありがとう。

4

4 に答える 4

5

MaciejGórski のアプローチとこの要点のコードを組み合わせました。さらに、バウンス効果を追加。

public class MyBounceInterpolator implements android.view.animation.Interpolator {
    double mAmplitude = 1;
    double mFrequency = 10;

    public MyBounceInterpolator(double amplitude, double frequency) {
        mAmplitude = amplitude;
        mFrequency = frequency;
    }

    public float getInterpolation(float time) {
        double amplitude = mAmplitude;
        if (amplitude == 0) { amplitude = 0.05; }

        // The interpolation curve equation:
        //    -e^(-time / amplitude) * cos(frequency * time) + 1
        //
        // View the graph live: https://www.desmos.com/calculator/6gbvrm5i0s
        return (float) (-1 * Math.pow(Math.E, -time/ mAmplitude) * Math.cos(mFrequency * time) + 1);
    }
}

void dropMarker(final Marker marker, GoogleMap map) {
    final LatLng finalPosition = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);

    Projection projection = map.getProjection();
    Point startPoint = projection.toScreenLocation(finalPosition);
    startPoint.y = 0;
    final LatLng startLatLng = projection.fromScreenLocation(startPoint);
    final Interpolator interpolator = new MyBounceInterpolator(0.11, 4.6);

    TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() {
        @Override
        public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) {
            float t = interpolator.getInterpolation(fraction);
            double lng = t * finalPosition.longitude + (1 - t) * startLatLng.longitude;
            double lat = t * finalPosition.latitude + (1 - t) * startLatLng.latitude;
            return new LatLng(lat, lng);
        }
    };

    Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position");
    ObjectAnimator animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, finalPosition);
    animator.setDuration(400);
    animator.start();
}

ここに画像の説明を入力

于 2016-06-24T07:52:59.907 に答える
2

それはうまく機能しますが、マーカーがターゲットから 1 ステップ離れたままになることがあるように思えたので、もう 1 行だけ追加しました。

if (t < 1.0) {
    // Post again 10ms later.
    handler.postDelayed(this, 50);
} else {
    // animation ended
    marker.setPosition(target);
}

それが役に立てば幸い。

于 2013-12-02T19:41:59.000 に答える