【问题标题】:How to create the radar animation at the center of Google Map? [closed]如何在谷歌地图中心创建雷达动画? [关闭]
【发布时间】:2017-05-30 22:03:52
【问题描述】:

我正在尝试为搜索效果提供类似雷达的动画。我为此找到了一些第三方库,但很难理解。有什么简单的方法可以实现。

【问题讨论】:

  • 展示你的努力。
  • 我是新人,只是尝试用谷歌搜索,但没有得到任何东西

标签: android google-maps android-layout android-animation


【解决方案1】:

在您使用的地图活动或片段中添加此代码。

private RadarView mapRadar;

现在在你放置标记的地方你可以使用这个:

 Marker marker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(userSourceLat, userSourceLng))
.title("No match Found")
.snippet("Searching for Match"));
mapRadar.setShowCircles(true);
if (mapRadar!= null) mapRadar.startAnimation();

下面是我们自定义的动画视图类

  public class RadarView extends View {

private final String LOG = "RadarView";
private final int POINT_ARRAY_SIZE = 25;
float alpha = 0;
Point latestPoint[] = new Point[POINT_ARRAY_SIZE];
Paint latestPaint[] = new Paint[POINT_ARRAY_SIZE];
android.os.Handler mHandler = new android.os.Handler();
private int fps = 100;
Runnable mTick = new Runnable() {
    @Override
    public void run() {
        invalidate();
        mHandler.postDelayed(this, 1000 / fps);
    }
};
private boolean showCircles = true;

public RadarView(Context context) {
    this(context, null);
}


public RadarView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    Paint localPaint = new Paint();
    localPaint.setColor(getResources().getColor(R.color.colorPrimary));
    localPaint.setAntiAlias(true);
    localPaint.setStyle(Paint.Style.STROKE);
    localPaint.setStrokeWidth(1.0F);
    localPaint.setAlpha(0);

    int alpha_step = 255 / POINT_ARRAY_SIZE;
    for (int i = 0; i < latestPaint.length; i++) {
        latestPaint[i] = new Paint(localPaint);
        latestPaint[i].setAlpha(255 - (i * alpha_step));
    }
}

public void startAnimation() {
    mHandler.removeCallbacks(mTick);
    mHandler.post(mTick);
}

public void stopAnimation() {
    mHandler.removeCallbacks(mTick);
}

public int getFrameRate() {
    return this.fps;
}

public void setFrameRate(int fps) {
    this.fps = fps;
}

;

public void setShowCircles(boolean showCircles) {
    this.showCircles = showCircles;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);


    int width = getWidth();
    int height = getHeight();

    int r = Math.min(width, height);


    //canvas.drawRect(0, 0, getWidth(), getHeight(), localPaint);

    int i = r / 2;
    int j = i - 1;
    Paint localPaint = latestPaint[0]; // GREEN

    if (showCircles) {
        canvas.drawCircle(i, i, j, localPaint);
        canvas.drawCircle(i, i, j, localPaint);
        canvas.drawCircle(i, i, j * 3 / 4, localPaint);
        canvas.drawCircle(i, i, j >> 1, localPaint);
        canvas.drawCircle(i, i, j >> 2, localPaint);
    }

    alpha -= 0.5;
    if (alpha < -360) alpha = 0;
    double angle = Math.toRadians(alpha);
    int offsetX = (int) (i + (float) (i * Math.cos(angle)));
    int offsetY = (int) (i - (float) (i * Math.sin(angle)));

    latestPoint[0] = new Point(offsetX, offsetY);

    for (int x = POINT_ARRAY_SIZE - 1; x > 0; x--) {
        latestPoint[x] = latestPoint[x - 1];
    }


    int lines = 0;
    for (int x = 0; x < POINT_ARRAY_SIZE; x++) {
        Point point = latestPoint[x];
        if (point != null) {
            canvas.drawLine(i, i, point.x, point.y, latestPaint[x]);
        }
    }


    lines = 0;
    for (Point p : latestPoint) if (p != null) lines++;

    boolean debug = false;
    if (debug) {
        StringBuilder sb = new StringBuilder(" >> ");
        for (Point p : latestPoint) {
            if (p != null) sb.append(" (" + p.x + "x" + p.y + ")");
        }

        Log.d(LOG, sb.toString());
        //  " - R:" + r + ", i=" + i +
        //  " - Size: " + width + "x" + height +
        //  " - Angle: " + angle +
        //  " - Offset: " + offsetX + "," + offsetY);
    }

   }

  }

注意:我不知道你为什么需要那个动画。但我使用它,默认情况下标记放置在地图的中心。我将地图放置在 relativeLayout 中,并将 raderView 放置在 RelativeLayout 的中心。

现在这是你的 xml

 <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bootomLayout">

<fragment
    android:id="@+id/mapView"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<your.packagename.RadarView
    android:id="@+id/radarView"
    android:layout_width="240dp"
    android:layout_height="240dp"
    android:layout_centerInParent="true"
     />

【讨论】:

  • 让我先试试
  • 它的工作就像魅力谢谢
  • 请问,private MapRadar mapRadar;的mapRadar在哪里使用?
  • @statosdotcom 感谢您弄清楚我编辑答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2013-10-04
  • 2014-02-20
相关资源
最近更新 更多