【问题标题】:Radar animation android雷达动画安卓
【发布时间】:2016-07-13 13:15:45
【问题描述】:

所以事情就是这样。我正在监视某些距离,我想在雷达动画中显示它们。基本雷达图像将是 like this (not exactly)

每个圆圈表示一个距离范围。这个想法是随着距离的变化,点会向圆圈移动。我最初的方法是用每个圆圈上的点制作同一雷达的不同图像,然后根据距离简单地切换它们。但是我想知道是否有机会(性能良好,并且在不同的分辨率下工作正常)拥有一个雷达的基本图像并简单地移动点。我希望我很清楚,如果有人有想法,我将非常感谢

我没有发布任何代码,因为我需要这个想法,然后在实现方面遇到困难

【问题讨论】:

    标签: android animation


    【解决方案1】:

    你试过这些例子吗?

    https://github.com/jfabrix101/RadarCustomVIew

    https://github.com/gpfduoduo/RadarScanView

    雷达.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();
        }
    }
    

    希望这将指导您满足您的要求。

    【讨论】:

    • 你上面的代码运行的超级好。如何在上面的代码中放置地理位置点。
    • 可以使用/*画水平线/ canvas.drawLine(i-r, j,i+r , j, localPaint); / 绘制垂直线 */ canvas.drawLine(i, j-r,i , j+r, localPaint);得到圆圈中的线条
    【解决方案2】:

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

    【讨论】:

    • 我想到了,但我将如何管理点位置? DP?这适用于任何分辨率或尺寸的屏幕吗?
    • 对于不同的分辨率,您需要多个雷达/点图像(即平板电脑上的雷达比智能手机上的雷达更大)。管理点位置取决于您的应用程序的实现。使用点位置的全局变量,如果您映射 (x,y) 坐标并将您的角色映射为原点,并且将范围内的对象映射到其与原点的 (x,y) 距离,您可以缩放这些坐标并映射在你的雷达上。
    【解决方案3】:

    “我正在监视某些距离”〜这是什么意思?

    为了让雷达创建一个扩展 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% 宽度处结束吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2011-11-15
    • 2011-12-04
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多