雷达动画 Android

3
这是一个监测某些距离的问题,我想用雷达动画来展示。基本的雷达图像可能会像这个(不完全相同)。其中每个圆表示一个距离范围。想法是随着距离的变化,点向圆移动。我的初始方法是使用相同雷达图像的不同图像,并在每个圆上放置点,根据距离简单地切换它们。但我想知道是否有机会(高效,适用于不同分辨率)只使用一个基本雷达图像并移动点。希望我表达清楚了,如果有人有想法,我将非常感激。因为我需要这个想法,所以没有发布任何代码,然后我会努力实现它。
3个回答

6

您尝试过这些示例吗?

https://github.com/jfabrix101/RadarCustomVIew

https://github.com/gpfduoduo/RadarScanView

i.e

Radar.java

public class RadarView extends View {

    private final String LOG = "RadarView";
    private final int POINT_ARRAY_SIZE = 25;

    private int fps = 100;
    private boolean showCircles = true;

    float alpha = 0;
    Point latestPoint[] = new Point[POINT_ARRAY_SIZE];
    Paint latestPaint[] = new Paint[POINT_ARRAY_SIZE];

    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(Color.GREEN);
        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));
        }
    }


        android.os.Handler mHandler = new android.os.Handler();
        Runnable mTick = new Runnable() {
        @Override
        public void run() {
            invalidate();
            mHandler.postDelayed(this, 1000 / fps);
        }
        };


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

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

    public void setFrameRate(int fps) { this.fps = fps; }
    public int getFrameRate() { return this.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);
        }

    }

}

在您的activity.xml文件中。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/black">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="start"
    android:onClick="startAniamtion"/>

<frusso.radartest.RadarView
    android:id="@+id/radarView"
    android:layout_width="240dp"
    android:layout_height="240dp"
    android:layout_gravity="center_horizontal"

    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="stop"
    android:onClick="stopAnimation"/>

Activity.java

public class MainActivity extends Activity {

    RadarView mRadarView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRadarView = (RadarView) findViewById(R.id.radarView);
        mRadarView.setShowCircles(true);
    }


    public void stopAnimation(View view) {
        if (mRadarView != null) mRadarView.stopAnimation();
    }

    public void startAnimation(View view) {
        if (mRadarView != null) mRadarView.startAnimation();
    }
}

希望这能指引您满足您的需求。


1
你上面的代码运行得非常好。如何在上面的代码中放置地理位置点? - Manoj Fegde
/* 绘制水平线 */ canvas.drawLine(i-r, j, i+r, j, localPaint);/* 绘制垂直线 */ canvas.drawLine(i, j-r, i, j+r, localPaint); 以获取圆形中的线条 - roshan posakya

0

我的做法是有一个雷达的静态图像和另外一个点的图像(如果你想要一个自定义的)。我会有2个主线程,一个是游戏循环,另一个是根据你的位置在雷达图像上移动点的线程。


我考虑过这个问题,但是如何管理小数点位置呢?dp单位可以吗?它能在任何分辨率或屏幕尺寸上工作吗? - user3497504
你需要为不同分辨率准备多个雷达/点阵图像(例如,在平板电脑上,雷达比在智能手机上大)。管理点的位置取决于您的应用程序的实现。如果您将(x,y)坐标映射并将您的角色映射为原点,并将靠近的对象映射到其(x,y)距离,则可以使用全局变量来获取点的位置,然后缩放那些坐标并在雷达上进行映射。 - Brandon S

0

"我正在监控特定的距离" 〜 这是什么意思?

要创建一个雷达,可以创建一个扩展ImageView的类。重写onDraw(Canvas canvas)方法,并将图像资源设置为雷达背景。

 @Override
 public void onDraw(Canvas canvas) {
     //draw background
     super.onDraw(canvas);

     for(PointF p : points)
     {
         //draw each point as an image.  Maybe, translate by width/2 and height/2
     }
 }

所以我正在使用一个翻译动画来将点设置在我想要的位置。我认为鉴于它的“relative_to_parent”功能,它应该按照我预期的方式工作。问题是我不确定我完全理解了动画,如果我将fromYValue设置为“relative_to_parent”,然后我设置为0.8,我的动画不应该在父级80%的宽度处结束吗? - user3497504

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接