Android 仿天通卫星对准(卫星在圆形卫星轨道上转动)效果实现

效果图在这里插入图片描述
View源码

package com.android.circlescalebar.view;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import com.android.circlescalebar.R;

public class SatelliteOrbitView extends View {

    private Paint orbitPaint;
    private Bitmap satelliteBitmap;
    private float orbitRadius;
    private float satelliteAngle;

    public SatelliteOrbitView(Context context) {
        super(context);
        init();
    }

    public SatelliteOrbitView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SatelliteOrbitView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        orbitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        orbitPaint.setColor(Color.argb(35, 255, 255, 0));
        orbitPaint.setStyle(Paint.Style.STROKE);
        orbitPaint.setStrokeWidth(80);

        // 加载卫星图片
        satelliteBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_satellite);
        orbitRadius = 260; // 轨道半径
        satelliteAngle = 270 % 360; // 初始角度
    }

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

        // 绘制圆形轨道
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, orbitRadius, orbitPaint);

        // 计算卫星位置
        float satelliteX = getWidth() / 2 + orbitRadius * (float) Math.cos(Math.toRadians(satelliteAngle));

        float satelliteY = getHeight() / 2 + orbitRadius * (float) Math.sin(Math.toRadians(satelliteAngle));

       // 绘制卫星
        Rect src = new Rect(0, 0, satelliteBitmap.getWidth(), satelliteBitmap.getHeight());

        Rect dst = new Rect((int) (satelliteX - satelliteBitmap.getWidth() / 6),
                (int) (satelliteY - satelliteBitmap.getHeight() / 6),
                (int) (satelliteX + satelliteBitmap.getWidth() / 6),
                (int) (satelliteY + satelliteBitmap.getHeight() / 6));
        // 卫星跟随轨道对齐
        canvas.rotate(satelliteAngle + 90, satelliteX, satelliteY);
        canvas.drawBitmap(satelliteBitmap, src, dst, null);
    }

    public void startAnimation() {
        ObjectAnimator animator = ObjectAnimator.ofFloat(this, "satelliteAngle", 0, 360);
        animator.setDuration(5000); // 设置动画持续时间
        animator.setInterpolator(new LinearInterpolator()); // 设置插值器
        animator.setRepeatCount(ObjectAnimator.INFINITE); // 设置重复次数为无限
        animator.setRepeatMode(ObjectAnimator.RESTART); // 设置重复模式为重新开始
        animator.start();
    }

    public void setSatelliteAngle(float angle) {
        this.satelliteAngle = (angle + 270)  % 360;
        invalidate(); // 请求重绘视图
    }
}

调用实现

SatelliteOrbitView satelliteOrbitView = findViewById(R.id.satelliteOrbitView);
count = 0;
mHandler.removeCallbacks(mRunnable);
mRunnable = new Runnable() {
    @Override
    public void run() {
        satelliteOrbitView.setSatelliteAngle(count);
        count++;
        if (count > 360) {
            // 停止循环
            mHandler.removeCallbacks(this);
        } else {
            // 继续循环
            mHandler.postDelayed(this, 15); // 每秒更新一次
        }
    }
};
mHandler.post(mRunnable);

布局

<com.android.circlescalebar.view.SatelliteOrbitView
    android:id="@+id/satelliteOrbitView"
    android:layout_width="215dp"
    android:layout_height="215dp"
    android:layout_gravity="center" />

相关推荐

  1. 手机卫星通信

    2024-03-15 11:20:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 11:20:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 11:20:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 11:20:01       87 阅读
  4. Python语言-面向对象

    2024-03-15 11:20:01       96 阅读

热门阅读

  1. Python进阶学习(5)反射

    2024-03-15 11:20:01       40 阅读
  2. 举例说明计算机视觉(CV)技术的优势和挑战

    2024-03-15 11:20:01       43 阅读
  3. 三维的旋转平移矩阵形式

    2024-03-15 11:20:01       44 阅读
  4. openGauss 脚本源码浅析(1)—— simpleInstall

    2024-03-15 11:20:01       32 阅读
  5. SpringCloud Stream笔记整理

    2024-03-15 11:20:01       42 阅读
  6. 智障版本GPT3实现

    2024-03-15 11:20:01       45 阅读
  7. 什么是单向数据流

    2024-03-15 11:20:01       38 阅读
  8. 《软件工程》复试问答题总结

    2024-03-15 11:20:01       42 阅读